Bagaimana membuat sumbu frekuensi untuk FFT genap dan ganjil?

12

Dapatkah saya mendapatkan bantuan tentang cara membuat sumbu frekuensi beralih dari frekuensi negatif ke frekuensi positif, (dalam Hertz), yang akan menjadi sumbu x dalam hasil FFT, tetapi diberikan FFT panjang genap, atau FFT panjang ganjil. Saya mengalami beberapa masalah saat membuatnya di MATLAB. (Asumsikan Anda tahu frekuensi sampling f_s).

TheGrapeBeyond
sumber
1
Ini dapat membantu Anda untuk berpikir tentang frekuensi yang ditempatkan sama di sekitar lingkaran unit. FFT 4-titik memiliki nampan frekuensi pada [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs], misalnya, yang lebih umum ditulis sebagai [0, fs / 4, fs / 2, -fs / 4]. FFT 3 titik memiliki nampan frekuensi pada [0 / 3fs, 1 / 3fs, 2 / 3fs], atau dapat ditulis sebagai [0, fs / 3, -fs / 3]. Untuk ukuran ganjil, jarak yang sama ini melompati frekuensi Nyquist, tetapi selalu menyertakan 0.
endolith
@endolith Analogi ini sangat membantu saya, terima kasih banyak!
Mark LeMoine

Jawaban:

5

Salah satu pendekatan hanyalah menghitung vektor frekuensi untuk output DFT yang tidak tergeser (yaitu apa yang akan Anda dapatkan langsung dari fft()fungsi MATLAB , tanpa melakukan fftshift()), lalu memetakan kembali frekuensi yang sesuai dengan lokasi di sisi negatif sumbu. Contoh:

% 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);

Jawaban yang diberikan oleh learnvst harus bekerja juga; ini hanyalah cara lain untuk berpikir tentang hal itu yang tidak memerlukan casing khusus untuk ukuran DFT genap / ganjil.

Jason R
sumber
Halo JasonR, yakin kode ini berfungsi, karena jika saya mencobanya dengan fs = 1000 dan Nfft = 256, f_normal_order yang saya mulai dengan angka positif, menjadi negatif, dan kemudian positif lagi. Panjangnya juga tidak cocok.
TheGrapeBeyond
Maaf, perbaiki beberapa kesalahan ketik pada kode. Itu seharusnya bekerja sekarang.
Jason R
9

Anda dapat membuat spektrum frekuensi positif dengan cukup sederhana (di mana fslaju pengambilan sampel dan NFFTjumlah tempat sampah fft). Dalam implementasi Matlab dari algoritma FFT, elemen pertama selalu merupakan komponen DC, karenanya mengapa array dimulai dari nol. Ini berlaku untuk nilai NFFT yang ganjil dan genap.

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

Jika Anda perlu membungkus spektrum frekuensi, Anda perlu mempertimbangkan apakah Anda memiliki NFFT bernomor ganjil. Selalu perlu ada komponen DC , jadi. .

df = fs/NFFT;
fAxis = (0:df:(fs-df)) - (fs-mod(NFFT,2)*df)/2;

Perhatikan bagaimana perhitungan sumbu frekuensi positif identik dengan di atas, tetapi perubahan istilah FFT berubah untuk mengakomodasi panjang FFT genap atau ganjil.

Cuplikan kode ini diambil dari jawaban panjang yang diposting di SO (yang mungkin Anda temukan menarik) ditemukan di sini: /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983

belajar
sumber
Oke, jadi bisakah saya menggunakan ini untuk NFFT aneh juga?
TheGrapeBeyond
Ah maaf. Saya melihat sedikit komplikasi ketika beralih dari -ve ke + ve frekuensi. Saya telah sedikit mengubah jawabannya.
learnvst