main_03_scy

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

ex-recv/03/03_scy/main_03_scy.m

코드 인덱스로 돌아가기

카테고리

Submission Archive

학습 소스 그룹

코드 길이

110

lines

작성자

-

날짜 정보 없음

패키지

none

pkg load 기준

전체 코드

전체 코드를 복사해서 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. 1 - 주파수 성분 m개가 포함된 sinusoidal 신호를 출력
  2. sin_signal(fs, duration, m)
  3. Signal - 중첩된 m개의 sin신호 / (1/fs : 1/fs : duration)
  4. 2 - 시간 그래프
  5. 그래프 출력
  6. 6 - 시간 신호 hanning 적용 전후 결과 비교
  7. hanning 적용 전후 시간신후 plotting
  8. hanning 적용 전후 FFT결과 비교

핵심 함수/주제

plotfigureprintfcalc_powersum_timelengthxlabelylabelabs

실습 과제

  • 샘플링 주파수나 입력 주파수를 바꿔 스펙트럼 변화를 비교해보세요.
  • 같은 연산을 내장 함수와 사용자 함수 두 방식으로 계산해 오차를 비교해보세요.
  • 질량/감쇠/강성 또는 전달함수 계수를 바꿔 응답 변화를 확인해보세요.

학습 팁

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

같은 카테고리의 다른 코드