main-04b

Signal Processing + Control & Dynamics 중심의 Octave 학습 예제

ex-04/main-04b.m

코드 인덱스로 돌아가기

카테고리

Exercise 04

학습 소스 그룹

코드 길이

96

lines

작성자

-

날짜 정보 없음

패키지

none

pkg load 기준

전체 코드

전체 코드를 복사해서 Octave에서 바로 실행할 수 있습니다.

%
% Zoom FFT implementation
% Developed by Won Sunggyu (fabre@pusan.ac.kr), 2016
%
% Reference
% http://blog.naver.com/PostView.nhn?blogId=coolstu&logNo=130115108264
%
# C:\dev_keyword\matlab\zoom fft

clc; clear all; close all;
run("../startup.m");

Tr = 6;
nn = 12000;
dt = Tr / nn;
Fs = 1 / dt;
df = Fs / nn;
tt = 0:dt:dt*(nn-1);
ff = 0:df:df*(nn-1);

% Force
amp1=2;
amp2=-1;
td0=0.008;
td1=0.002;
td2=0.004;
x = double_half_sine(tt, amp1, amp2, td0, td1, td2);

% Response
f0 = 80; % sdof natural frequency
Q = 500;
xi = 1 / (2*Q); % sdof damping
wn = 2*pi*f0;
m0 = 1;
k0 = m0*wn^2;
[u, du, ddu] = newmark_int(tt, x, 0.0, 0.0, m0, k0, xi);
u = u';
du = du';
ddu = ddu';

% z=ddu;
% z=z+x; % relative to absolute value
% z=z*50; % as stress level in MPa (acceleration to stress scaling, refer to Seq)

figured("Name", "Newmark-β", "Size", [960, 960], "Move", [0, 0]);
ax = subplots(4, 1);
plot(ax(1), tt, x, ";f;")
plot(ax(2), tt, u, ";u;")
plot(ax(3), tt, du, ";du;")
plot(ax(4), tt, ddu, ";ddu;");

set(ax(1), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(2), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(3), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(4), "Xlim", [0, 1], "Xlabel", "Time [sec]");

% Modulated (zoom)
z0 = ddu;  # original signal
f1 = f0 - f0 * 0.3;  # modulation frequency
mx = 2 * cos(2 * pi * f1 * tt);  # modulation signal
z1 = z0 .* mx;  # modulated signal

% Filtered
[b, a] = butter(4 ,(f0 - f1) * 1.1 / (Fs / 2), "low");
z2 = filter(b, a, z1);  # filtered modulated signal

% FFT
Z0 = fft(z0) / nn;  # original fft
Z1 = fft(z1) / nn;  # modulated fft
Z2 = fft(z2) / nn;  # zoom fft

# frequency shifting
# target f0 = 80
# shift f1 = 56
# reveal at (f0 - f1) = 24

# two-sided
# ff = ff - Fs / 2;

figured("Name", "Filtered", "Size", [960, 960], "Move", [0, 0]);
ax = subplots(6, 1);
plot(ax(1), tt, z0, ";z-acc;")
plot(ax(2), tt, z1, ";modulated z;")
plot(ax(3), tt, z2, ";filtered modulated z;")
plot(ax(4), ff, sqrt(abs(Z0.*conj(Z0))), ";Z;");
plot(ax(5), ff, sqrt(abs(Z1.*conj(Z1))), ";modulated Z;");
plot(ax(6), ff, sqrt(abs(Z2.*conj(Z2))), ";filtered modulated Z;");

set(ax(1), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(2), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(3), "Xlim", [0, 1], "Xlabel", "Time [sec]");
set(ax(4), "Xlabel", "Frequency [Hz]", "Ylim", [0, 2e-5]);
set(ax(5), "Xlabel", "Frequency [Hz]", "Ylim", [0, 2e-5]);
set(ax(6), "Xlabel", "Frequency [Hz]", "Ylim", [0, 2e-5]);

코드 해설

목적

Signal Processing + Control & Dynamics 중심의 Octave 학습 예제

입력

  • 스크립트 상단에서 정의한 파라미터/입력 데이터를 사용합니다.

출력

  • 그래프/figure 출력

실행 흐름

  1. Zoom FFT implementation
  2. FFT

핵심 함수/주제

axplotsetabsconjfftsqrtfigured

실습 과제

  • 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
  • 질량/감쇠/강성 또는 전달함수 계수를 바꿔 응답 변화를 확인해보세요.
  • 축 범위와 라벨을 바꿔 그래프 해석성이 어떻게 달라지는지 확인해보세요.

학습 팁

  • FFT 결과는 샘플링 주파수(fs)와 길이(nn) 설정에 민감하므로 먼저 축 정의를 확인하세요.
  • 그래프 비교 시 축 범위(XLim/YLim)와 단위를 먼저 고정하면 해석 오류를 줄일 수 있습니다.

같은 카테고리의 다른 코드