main_03_ksg

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

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

코드 인덱스로 돌아가기

카테고리

Submission Archive

학습 소스 그룹

코드 길이

94

lines

작성자

-

날짜 정보 없음

패키지

none

pkg load 기준

전체 코드

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

################################################################################
% 주제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 (내장함수)

핵심 함수/주제

lengthplotconjcalc_pwr_sum_freqcalc_pwr_sum_timeffttrans_two_sidedhanning

실습 과제

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

학습 팁

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

같은 카테고리의 다른 코드