Main Content

기본 스펙트럼 분석

푸리에 변환은 시간 영역 신호의 주파수 및 파워 스펙트럼 분석을 수행하는 도구입니다.

스펙트럼 분석 양

스펙트럼 분석은 균일하게 샘플링된 이산 데이터에 포함된 주파수 스펙트럼을 조사합니다. 푸리에 변환은 시간 기반 신호나 공간 기반 신호의 주파수 성분을 주파수 영역에서 나타내는 툴입니다. 다음 표에는 신호 속성의 특징을 나타내고 해석하는 데 사용되는 일반적인 양이 나와 있습니다. 푸리에 변환에 대해 자세히 알아보려면 푸리에 변환(Fourier Transform) 항목을 참조하십시오.

설명
x

샘플링된 데이터

n = length(x)

샘플 수

fs

샘플 주파수(단위 시간당 또는 단위 공간당 샘플 수)

dt = 1/fs

샘플당 시간 또는 공간 증분

t = (0:n-1)/fs

데이터의 시간 또는 공간 범위

y = fft(x)

데이터의 이산 푸리에 변환(DFT)

abs(y)

DFT의 진폭

(abs(y).^2)/n

DFT의 거듭제곱

fs/n

주파수 증분

f = (0:n-1)*(fs/n)

주파수 범위

fs/2

나이퀴스트 주파수(주파수 범위의 중간점)

잡음이 있는 신호

푸리에 변환은 랜덤 잡음에 의해 손상된 신호의 주파수 성분을 계산합니다.

15Hz 및 40Hz의 성분 주파수로 신호를 만들고 랜덤 가우스 잡음을 넣습니다.

rng('default')
fs = 100;                                % sample frequency (Hz)
t = 0:1/fs:10-1/fs;                      % 10 second span time vector
x = (1.3)*sin(2*pi*15*t) ...             % 15 Hz component
  + (1.7)*sin(2*pi*40*(t-2)) ...         % 40 Hz component
  + 2.5*randn(size(t));                  % Gaussian noise;

신호의 푸리에 변환을 통해 해당 주파수 성분을 식별합니다. MATLAB®에서는 fft 함수가 고속 푸리에 변환 알고리즘을 사용하여 푸리에 변환을 계산합니다. fft를 사용하여 신호의 이산 푸리에 변환을 계산합니다.

y = fft(x);

파워 스펙트럼을 주파수의 함수로 플로팅합니다. 잡음은 시간 기반 공간에서 신호의 주파수 성분인 것처럼 나타나는데, 푸리에 변환은 이를 전력 스파이크로 나타냅니다.

n = length(x);          % number of samples
f = (0:n-1)*(fs/n);     % frequency range
power = abs(y).^2/n;    % power of the DFT

plot(f,power)
xlabel('Frequency')
ylabel('Power')

Figure contains an axes object. The axes object with xlabel Frequency, ylabel Power contains an object of type line.

여러 응용 사례에서, 0 주파수에 중심을 맞추고 파워 스펙트럼을 확인하면 신호의 주기성이 잘 드러나기 때문에 더욱 편리합니다. fftshift 함수를 사용하여 y에서 원형 이동을 수행하고 0을 중심으로 전력을 플로팅합니다.

y0 = fftshift(y);         % shift y values
f0 = (-n/2:n/2-1)*(fs/n); % 0-centered frequency range
power0 = abs(y0).^2/n;    % 0-centered power

plot(f0,power0)
xlabel('Frequency')
ylabel('Power')

Figure contains an axes object. The axes object with xlabel Frequency, ylabel Power contains an object of type line.

오디오 신호

푸리에 변환을 사용하여 오디오 데이터의 주파수 스펙트럼을 분석할 수 있습니다.

파일 bluewhale.au에는 캘리포니아 연안에서 수중 마이크로 녹음한 태평양 흰긴수염고래 소리의 오디오 데이터가 포함되어 있습니다. 이 파일은 코넬대 생물 음향학 연구 프로그램(Cornell University Bioacoustics Research Program)에서 관리하는 동물 소리 라이브러리에서 생성된 것입니다.

흰긴수염고래 울음소리는 매우 낮기 때문에 사람에게는 거의 들리지 않습니다. 피치를 올려서 울음소리가 더 명확하게 들리도록 데이터의 시간 스케일을 1/10로 압축했습니다. 오디오 데이터를 읽고 플로팅합니다. sound(x,fs) 명령을 사용하여 오디오를 청취할 수 있습니다.

whaleFile = 'bluewhale.au';
[x,fs] = audioread(whaleFile);

plot(x)
xlabel('Sample Number')
ylabel('Amplitude')

Figure contains an axes object. The axes object with xlabel Sample Number, ylabel Amplitude contains an object of type line.

처음에 "짧게 반복되는 소리"가 난 다음에 세 번의 "긴 울음소리"가 이어집니다. 이 예제에서는 긴 울음소리 한 개를 분석합니다. 첫 번째 긴 울음소리가 대부분을 차지하는 새 데이터를 지정하고 10배 빠른 속도에 맞게 시간 데이터를 수정합니다. 잘린 신호를 시간 함수로 플로팅합니다.

moan = x(2.45e4:3.10e4);
t = 10*(0:1/fs:(length(moan)-1)/fs);

plot(t,moan)
xlabel('Time (seconds)')
ylabel('Amplitude')
xlim([0 t(end)])

Figure contains an axes object. The axes object with xlabel Time (seconds), ylabel Amplitude contains an object of type line.

데이터를 푸리에 변환하여 오디오 신호에서 주파수 성분을 식별합니다. fft를 사용하여 대량의 데이터를 처리하는 경우 샘플 개수가 2의 거듭제곱이 되도록 입력값 크기를 재조정하는 경우가 많습니다. 그러면 특히 큰 소인수로 구성된 샘플 크기의 경우, 변환의 계산 속도를 크게 향상시킬 수 있습니다. 2의 거듭제곱인 새 신호 길이 n을 지정하고 fft 함수를 사용하여 신호의 이산 푸리에 변환을 계산합니다. fft는 원래 데이터를 0으로 자동으로 채워서 샘플 크기를 늘립니다.

m = length(moan);       % original sample length
n = pow2(nextpow2(m));  % transform length
y = fft(moan,n);        % DFT of signal

가속 인수에 따라 주파수 범위를 조정하고, 신호의 파워 스펙트럼을 계산하고 플로팅합니다. 이 플롯은 긴 울음소리가 약 17Hz의 기본주파수와 일련의 고조파로 구성되어 있고, 두 번째 고조파가 두드러져 있음을 나타냅니다.

f = (0:n-1)*(fs/n)/10;
power = abs(y).^2/n;      

plot(f(1:floor(n/2)),power(1:floor(n/2)))
xlabel('Frequency')
ylabel('Power')

Figure contains an axes object. The axes object with xlabel Frequency, ylabel Power contains an object of type line.

참고 항목

| | | | |

관련 항목