짝수 및 홀수 FFT 길이에 대해 주파수 축을 만드는 방법은 무엇입니까?


12

주파수 축을 음의 주파수에서 양의 주파수로 변환하는 방법 (Hertz 단위)으로 FFT 결과에서 x 축이되지만 짝수 길이 FFT 또는 홀수 길이 FFT가 제공되는 방법에 대한 도움을받을 수 있습니다. MATLAB에서 만드는 데 문제가 있습니다. (샘플링 주파수 f_s를 알고 있다고 가정하십시오).


1
단위 원 주위에 균등하게 배치 된 주파수에 대해 생각하는 데 도움이 될 수 있습니다. 예를 들어, 4 포인트 FFT는 [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs]에 주파수 빈이 있으며 [0, fs / 4, fs / 2, -fs / 4]. 3 점 FFT는 주파수 빈이 [0 / 3fs, 1 / 3fs, 2 / 3fs]에 있거나 [0, fs / 3, -fs / 3]로 기록 될 수 있습니다. 홀수 크기의 경우 동일한 간격은 나이 퀴 스트 주파수를 건너 뛰지 만 항상 0을 포함합니다.
endolith

@endolith이 비유가 엄청나게 나를 도와주었습니다. 대단히 감사합니다!
Mark LeMoine

답변:


5

한 가지 방법은 단순히 시프트되지 않은 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 크기를위한 특별한 케이싱이 필요없는 그것에 대해 생각하는 또 다른 방법입니다.


안녕하세요 JasonR,이 코드가 작동하고 있는지 확인하십시오 .fs = 1000 및 Nfft = 256으로 시도하면 f_normal_order는 양수로 시작하여 음수가 된 다음 다시 양수가되기 때문에. 또한 길이가 일치하지 않습니다.
TheGrapeBeyond

코드에서 오타가 수정되었습니다. 지금 작동합니다.
Jason R

9

양의 주파수 스펙트럼을 매우 간단하게 만들 수 있습니다 ( 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


그렇다면 NFFT를 홀수로 사용할 수 있습니까?
TheGrapeBeyond

아 죄송합니다 -ve에서 + ve 빈도로 갈 때 약간의 합병증이 보입니다. 나는 대답을 약간 바꿨다.
learnvst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.