Octave Atelier

코드와 해설을 함께 읽는 학습 문서

Code Detail

main_03_ksg

Signal Processing + Statistics 중심의 Octave 학습 예제

ex-recv/03/03_ksg_new/main_03_ksg.m

목록으로

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

카테고리

Submission Archive

submission

코드 길이

94

lines

작성자

-

날짜 정보 없음

패키지

none

pkg load

전체 코드

94 lines

################################################################################
% 주제3 (수정 제출): 신호 생성, 주파수 변환, 파워 계산을 합니다.
% 2025-04-08 / 김상곤
################################################################################
clc; clear; close all
run startup.m
% Loading Signal Parameter
load('signal_param.mat') % freq_array, ampl_array, phaz_array [1 x 주파수 성분 수]

% 입력 변수 준비
T = 1;
t0 = 0;
dt = 1/1000;
N = T/dt;
Fs = 1/dt;
df = 1/T;
freq = 0:df:Fs-df;
time_array = t0:dt:T-dt; % size: 1 x N

% sinusoidal 신호 생성
signal = get_sinusoidal(time_array,freq_array,ampl_array,phaz_array); % size: 1 x length(time_array)

% hanning window 적용
ACF = 2; % Amplitude Correction Factor
ECF = 1.63; % Energy Correction Factor
signal_h_A = ACF*signal.*hanning(N).';  % size: 1 x length(time_array)
signal_h_E = ECF*signal.*hanning(N).';  % size: 1 x length(time_array)

% 주파수 데이터로 변환
Spectrum = fft(signal,[],2)/N;  % size: 1 x length(freq)
Spectrum_h_A = fft(signal_h_A,[],2)/N; % size: 1 x length(freq)
Spectrum_h_E = fft(signal_h_E,[],2)/N; % size: 1 x length(freq)

% Auto Power Spectrum 계산
APS = Spectrum.*conj(Spectrum); % size: 1 x length(freq)
% Auto Power Spectrum 계산 (hanning window 적용)
APS_h_A = Spectrum_h_A.*conj(Spectrum_h_A); % size: 1 x length(freq)
APS_h_E = Spectrum_h_E.*conj(Spectrum_h_E); % size: 1 x length(freq)

% Power Sum
pwr_sum_time = calc_pwr_sum_time(signal); % 결과: 64.5
pwr_sum_freq = calc_pwr_sum_freq(Spectrum); % 결과: 64.5 → 시간영역 총 에너지 = 주파수영역 총 에너지

% Power Sum (hanning window 적용)
pwr_sum_time_h_A = calc_pwr_sum_time(signal_h_A); % 결과: 96.653
pwr_sum_time_h_E = calc_pwr_sum_time(signal_h_E); % 결과: 64.200
pwr_sum_freq_h_A = calc_pwr_sum_freq(Spectrum_h_A); % 결과: 96.653
pwr_sum_freq_h_E = calc_pwr_sum_freq(Spectrum_h_E); % 결과: 64.200

% hanning window Correction Factor 별 에너지 비교
ratio_A = pwr_sum_time_h_A/pwr_sum_time; % 원신호 에너지의 1.4985배
ratio_E = pwr_sum_time_h_E/pwr_sum_time; % 원신호 에너지의 0.9953배 → 오차율 0.5%
################################################################################
% Plotting 변수 준비
[two_sided_freq, APS_two_sided] = trans_two_sided(APS,freq,Fs);
[~, APS_h_A_two_sided] = trans_two_sided(APS_h_A,freq,Fs);
[~, APS_h_E_two_sided] = trans_two_sided(APS_h_E,freq,Fs);

% Plotting
figure(1)
subplot(2,1,1)
plot(time_array,signal,'k;orignal;','linewidth',3)
plot(time_array,signal_h_A,'g;windowed ACF;','linewidth',2)
plot(time_array,signal_h_E,'r;windowed ECF;','linewidth',2)
xlabel('Time [sec]'); ylabel('Acceleration [m/s^2]')
title('< 윈도우 적용 전후 시간 신호 비교 >')

subplot(2,1,2)
plot(two_sided_freq ,APS_two_sided,'k;orignal;','linewidth',3)
plot(two_sided_freq ,APS_h_A_two_sided,'g;windowed ACF;','linewidth',1)
plot(two_sided_freq ,APS_h_E_two_sided,'r;windowed ECF;','linewidth',2)
xlabel('Frequency [Hz]'); ylabel('Auto Power Spectrum [(m/s^2)^2]')
xlim([-1 1]*Fs/2); ylim([0 30])
title('< 윈도우 적용 전후 Auto Power Spectrum 비교 >')

# from
# Spectrum_h_A.*conj(Spectrum_h_A)
# to
# conj(Spectrum_h_A) .* Spectrum_h_A

# from
# two_sided_freq
# to
# fftshift (내장함수)

# 시간 플롯 너무 두꺼워 (취소)
# figure 너무 작아 (취소)
# Fontsize 너무 작아 (취소)

# clc; clear; close all
# run startup.m # 이거 미리 써놓던가

# 변수 출력 방식은 시험 문제를 참조할 것

코드 해설

목적

  • Signal Processing + Statistics 중심의 Octave 학습 예제

입력

  • 입력 파일: signal_param.mat

출력

  • 그래프/figure 출력

실행 흐름

  1. Loading Signal Parameter
  2. 입력 변수 준비
  3. hanning window 적용
  4. 주파수 데이터로 변환
  5. Auto Power Spectrum 계산 (hanning window 적용)
  6. Power Sum (hanning window 적용)
  7. hanning window Correction Factor 별 에너지 비교
  8. Plotting 변수 준비
  9. Plotting
  10. fftshift (내장함수)

핵심 함수

  • length
  • plot
  • conj
  • calc_pwr_sum_freq
  • calc_pwr_sum_time
  • fft
  • trans_two_sided
  • hanning

실습 과제

  • 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
  • 같은 연산을 내장 함수와 사용자 함수 두 방식으로 계산해 오차를 비교해보세요.
  • 축 범위와 라벨을 바꿔 그래프 해석성이 어떻게 달라지는지 확인해보세요.

학습 팁

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

같은 카테고리 코드

이전 코드 get_sinusoidal 다음 코드 startup