Як зробити вісь частоти для парної та непарної довжини FFT?


12

Чи можу я отримати довідку про те, як перетворити вісь частоти від негативної частоти до позитивної частоти (в герцах), це буде вісь x у результаті FFT, але з огляду на парну довжину 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 Ця аналогія допомогла мені надзвичайно, велике спасибі!
Марк

Відповіді:


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

Вибачте, виправили пару помилок у коді. Це має працювати зараз.
Джейсон R

9

Позитивний спектр частоти можна зробити досить просто (де fsчастота дискретизації та NFFTкількість відходів у футах). У реалізації Matlab алгоритму FFT перший елемент завжди є компонентом постійного струму, отже, чому масив починається з нуля. Це справедливо для непарних і парних значень NFFT.

%//Calculate frequency axis
df = fs/NFFT;
fAxis = 0:df:(fs-df);

Якщо вам потрібно обернути частотний спектр, вам потрібно врахувати, чи є у вас непарна NFFT. Завжди повинен бути компонент постійного струму , тому. .

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.