main_03_scy
Signal Processing + Statistics 중심의 Octave 학습 예제
ex-recv/03/03_scy/main_03_scy.m
전체 코드
전체 코드를 복사해서 Octave에서 바로 실행할 수 있습니다.
# 신호 생성, 주파수 변환, 파워 계산
# 작성자 : 신찬영
# 작성날짜 : 25.04.07.
clc
clear
posi = [-00, 00, 1000, 500]; %figure 위치 선정
# 1 - 주파수 성분 m개가 포함된 sinusoidal 신호를 출력
[t, signal, fs] = get_signal(1000, 5, 4);
%sin_signal(fs, duration, m)
% Input :
% fs - 샘플링 주파수 (Hz)
% duration - 신호 길이 (s)
% m - sin 함수 개수
% Output :
% Signal - 중첩된 m개의 sin신호 / (1/fs : 1/fs : duration)
% fs - 샘플링 주파수 (Hz) / (-fs/2 : duration/fs : fs/2-duration/fs)
% t - 신호 길이 (s) / (1/fs : 1/fs : duration)
# 2 - 시간 그래프
figure(1,'position',(posi))
plot(t, signal);
grid on;
xlabel("Time[sec]")
ylabel("Acc[m/s^2]")
# 3 - 시간 신호에 대해 auto-power spectrum을 two-side로 그리기
N = length(signal);
X = fft(signal); %(1,N)
X2 = abs(X).^2 / N; %(1,N)
f = fs/N * (-N/2:N/2-1); % 주파수 축 생성 (양쪽 모두)
% 그래프 출력
figure(2,'position',(posi))
plot(f, X2);
grid on;
# 4 - 시간 도메인에서 power sum 계산
P_time = calc_powersum_time(signal);
printf("powersum(time) : %6.2f m^2/s^3 \n", P_time);
# 5 - 주파수 도메인에서 power sum 계산
P_freq = calc_powersum_freq(signal);
printf("powersum(freq) : %6.2f m^2/s^3 \n", P_freq);
# 6 - 시간 신호 hanning 적용 전후 결과 비교
N = length(signal);
w = hanning(N); %(N,1)
signal_hann = signal(:) .* w(:); % hanning 적용 / (N,1)
% hanning 적용 전후 시간신후 plotting
figure(3,'position',(posi))
plot(t, signal); hold on % 원본 신호
plot(t, signal_hann); % hanning 적용 신호
grid on;
hold off;
xlabel("Time[sec]")
ylabel("Acc[m/s^2]")
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% hanning 적용 전후 FFT결과 비교
N_hann = length(signal_hann);
X_hann = fft(signal_hann); % (N_hann,1)
X2_hann = abs(X).^2 / N_hann; % (1,N_hann)
f_hann = fs * (-N_hann/2:N_hann/2-1) / N_hann; % (1,N_hann) % 주파수 축 생성
% 그래프 출력
figure(2,'position',(posi));
plot(f_hann, X2,'linewidth',3); hold on % 원본신호
plot(f_hann, X2_hann,'linewidth',1); % hanning 적용 신호
hold off
xlabel('Frequency (Hz)');
ylabel('Power');
grid on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% hanning 적용 전후 power sum 비교 / correction factor 계산
P_hann = calc_powersum_time(signal_hann);
ACF = sqrt(P_time / P_hann) % Hanning correction factor
P_time_hann = calc_powersum_time(ACF * signal_hann);
P_freq_hann = calc_powersum_freq(ACF * signal_hann);
printf("powersum_hann(time) : %6.2f m^2/s^3 \n", P_time_hann);
printf("powersum)hann(freq) : %6.2f m^2/s^3 \n", P_freq_hann);
코드 해설
목적
Signal Processing + Statistics 중심의 Octave 학습 예제
입력
- 스크립트 상단에서 정의한 파라미터/입력 데이터를 사용합니다.
출력
- 그래프/figure 출력
- 콘솔 텍스트 출력
실행 흐름
- 1 - 주파수 성분 m개가 포함된 sinusoidal 신호를 출력
- sin_signal(fs, duration, m)
- Signal - 중첩된 m개의 sin신호 / (1/fs : 1/fs : duration)
- 2 - 시간 그래프
- 그래프 출력
- 6 - 시간 신호 hanning 적용 전후 결과 비교
- hanning 적용 전후 시간신후 plotting
- hanning 적용 전후 FFT결과 비교
핵심 함수/주제
plotfigureprintfcalc_powersum_timelengthxlabelylabelabs
실습 과제
- 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
- 같은 연산을 내장 함수와 사용자 함수 두 방식으로 계산해 오차를 비교해보세요.
- 질량/감쇠/강성 또는 전달함수 계수를 바꿔 응답 변화를 확인해보세요.
학습 팁
- FFT 결과는 샘플링 주파수(fs)와 길이(nn) 설정에 민감하므로 먼저 축 정의를 확인하세요.
- 그래프 비교 시 축 범위(XLim/YLim)와 단위를 먼저 고정하면 해석 오류를 줄일 수 있습니다.
같은 카테고리의 다른 코드
- 수치미분
ex-recv/01/01-CJW-20250321/수치미분.m - main_cjw
ex-recv/01/01-CJW-20250321/main_cjw.m - main-my_diff
ex-recv/01/01-JKH-20250319/main-my_diff.m - hw_1_kim-gpt
ex-recv/01/01-KSG-20250318/hw_1_kim-gpt.m - hw_1_kim
ex-recv/01/01-KSG-20250318/hw_1_kim.m - [Octave] HW#1
ex-recv/01/01-LSH-20250319/[Octave] HW#1.m - Octave_Moon_250319
ex-recv/01/01-MJY-20250319/Octave_Moon_250319.m - Octave01_Park,jm_250319
ex-recv/01/01-PJM-20250319/Octave01_Park,jm_250319.m - [Octave]250318_RYU_poly,dff
ex-recv/01/01-RJW-20250321/[Octave]250318_RYU_poly,dff.m - 과제1_신찬영연구원
ex-recv/01/01-SCY-20250319/과제1_신찬영연구원.m