주파수 축을 음의 주파수에서 양의 주파수로 변환하는 방법 (Hertz 단위)으로 FFT 결과에서 x 축이되지만 짝수 길이 FFT 또는 홀수 길이 FFT가 제공되는 방법에 대한 도움을받을 수 있습니다. MATLAB에서 만드는 데 문제가 있습니다. (샘플링 주파수 f_s를 알고 있다고 가정하십시오).
주파수 축을 음의 주파수에서 양의 주파수로 변환하는 방법 (Hertz 단위)으로 FFT 결과에서 x 축이되지만 짝수 길이 FFT 또는 홀수 길이 FFT가 제공되는 방법에 대한 도움을받을 수 있습니다. MATLAB에서 만드는 데 문제가 있습니다. (샘플링 주파수 f_s를 알고 있다고 가정하십시오).
답변:
한 가지 방법은 단순히 시프트되지 않은 DFT 출력에 대한 주파수 벡터를 계산하는 것입니다 (즉 fft()
,을 수행하지 않고 MATLAB의 기능 에서 직접 얻을 수있는 것 fftshift()
). 예:
% assume input signal "x", sampling frequency "fs"
% calculate FFT
X = fft(x,Nfft);
% calculate frequency spacing
df = fs / Nfft;
% calculate unshifted frequency vector
f = (0:(Nfft-1))*df;
% move all frequencies that are greater than fs/2 to the negative side of the axis
f(f >= fs/2) = f(f >= fs/2) - fs;
% now, X and f are aligned with one another; if you want frequencies in strictly
% increasing order, fftshift() them
X_normal_order = fftshift(X);
f_normal_order = fftshift(f);
learnvst가 제공 한 답변도 효과가 있습니다. 이것은 짝수 / 홀수 DFT 크기를위한 특별한 케이싱이 필요없는 그것에 대해 생각하는 또 다른 방법입니다.
양의 주파수 스펙트럼을 매우 간단하게 만들 수 있습니다 ( fs
샘플링 속도 NFFT
는 fft bin의 수입니다). FFT 알고리즘의 Matlab 구현에서 첫 번째 요소는 항상 DC 구성 요소이므로 배열은 0에서 시작합니다. NFFT의 홀수 및 짝수 값에 해당됩니다.
%//Calculate frequency axis
df = fs/NFFT;
fAxis = 0:df:(fs-df);
주파수 스펙트럼을 랩핑해야하는 경우 홀수 NFFT가 있는지 여부를 고려해야합니다. 항상 DC 구성 요소가 필요합니다 . .
df = fs/NFFT;
fAxis = (0:df:(fs-df)) - (fs-mod(NFFT,2)*df)/2;
양의 주파수 축 계산이 위와 동일하지만 FFT- 시프트 된 항이 짝수 또는 홀수 FFT 길이를 수용하도록 변경됩니다.
이 코드 조각은 SO (당신이 흥미를 찾을 수 있음)에 게시 긴 대답에서 찍은는 여기에서 찾을 : /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983