main-04b
Signal Processing + Control & Dynamics 중심의 Octave 학습 예제
ex-04/main-04b.m
전체 코드
전체 코드를 복사해서 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 출력
실행 흐름
- Zoom FFT implementation
- FFT
핵심 함수/주제
axplotsetabsconjfftsqrtfigured
실습 과제
- 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
- 질량/감쇠/강성 또는 전달함수 계수를 바꿔 응답 변화를 확인해보세요.
- 축 범위와 라벨을 바꿔 그래프 해석성이 어떻게 달라지는지 확인해보세요.
학습 팁
- FFT 결과는 샘플링 주파수(fs)와 길이(nn) 설정에 민감하므로 먼저 축 정의를 확인하세요.
- 그래프 비교 시 축 범위(XLim/YLim)와 단위를 먼저 고정하면 해석 오류를 줄일 수 있습니다.
같은 카테고리의 다른 코드
- double_half_sine
ex-04/double_half_sine.m - main-04
ex-04/main-04.m - newmark_int
ex-04/newmark_int.m