Pertanyaan Merencanakan FFT pada oktaf


Saya tahu bahwa FFT mengubah fungsi dalam domain waktu ke satu ditampilkan dalam domain frekuensi.

Namun, ketika saya mencoba memplot grafik tersebut di domain frekuensi, saya hanya bisa membuatnya berfungsi dengan baik dengan menggunakan waktu sebagai sumbu X, padahal seharusnya tidak seperti itu, tetapi frekuensinya.

Juga, saya hanya bisa mendapatkan amplitudo untuk mencocokkan yang ada di sinyal asli dengan membagi sumbu y dengan bilangan bulat tertentu. Mengapa demikian?

Ini kode saya

t=0:0.001:2

x=2*sin(20*pi*t) + sin(100*pi*t)
subplot(2,1,1)
plot(1000*t,x)
grid
xlabel("Time in milliseconds")
ylabel("Signal amplitude")

subplot(2,1,2)
y=fft(x)
plot(1000*t,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")

dan grafik.

enter image description here

Tolong bantu = (


10
2017-09-11 22:03


asal


Jawaban:


Hubungan frekuensi (skala sumbu x)

Frekuensi setiap nilai yang dihasilkan oleh FFT secara linier terkait dengan indeks nilai output melalui:

f(i) = (i-1)*sampling_frequency/N

Di mana N adalah jumlah poin FFT (mis. N=length(y)). Dalam kasusmu, N=2001.

Satu dapat mengurangi frekuensi sampling dari definisi Anda t sebagai 1 / T di mana T adalah interval waktu pengambilan sampel (T = 0,001 dalam kasus Anda). Jadi frekuensi samplingnya adalah 1000Hz.

Perhatikan bahwa karena nilai t(i) juga secara linier terkait dengan indeks i, melalui

t(i) = (i-1)*0.001

itu mungkin (meskipun tidak perlu disarankan, karena ini hanya akan mengaburkan kode Anda) untuk menentukan f = 1000*t*sampling_frequency/N. Perhatikan bahwa Anda kehilangan sampling_frequency/N istilah yang secara bersamaan menghasilkan nada yang ditampilkan pada frekuensi yang salah (dari definisi x harus ada puncak pada 10Hz dan 50Hz, dan aliases yang sesuai pada 990Hz dan 950Hz).

Hubungan amplitudo (skala sumbu y)

Perhatikan bahwa hubungan yang diamati hanya perkiraan, sehingga yang berikut bukan merupakan bukti matematis, tetapi hanya cara intuitif untuk memvisualisasikan hubungan antara amplitudo nada waktu-domain dan nilai-nilai puncak frekuensi-domain.

Menyederhanakan masalah menjadi satu nada:

x = A*sin(2*pi*f*t)

Amplitudo perkiraan dari puncak yang sesuai dapat diturunkan menggunakan Teorema Parseval:

enter image description here

Dalam domain waktu (sisi kiri persamaan), ekspresi kira-kira sama dengan 0.5*N*(A^2).

Dalam domain frekuensi (sisi kanan persamaan), buat asumsi berikut:

  • efek kebocoran spektral dapat diabaikan
  • isi spektrum nada hanya berisi 2 tempat (pada frekuensi f dan frekuensi alias yang terkait sampling_frequency-f) akun untuk penjumlahan (semua sampah lainnya adalah ~ 0). Perhatikan bahwa ini biasanya hanya berlaku jika frekuensi nada merupakan pengganda yang tepat (atau hampir tepat) dari sampling_frequency/N.

ekspresi di sisi kanan kira-kira sama dengan 2*(1/N)*abs(X(k))^2 untuk beberapa nilai k sesuai dengan puncak pada frekuensi f.

Menempatkan dua hasil bersama abs(X(k)) ~ 0.5*A*N. Dengan kata lain amplitudo output menunjukkan faktor penskalaan 0.5*N (atau sekitar 1000 dalam kasus Anda) sehubungan dengan amplitudo domain waktu, seperti yang Anda amati.

Idenya masih berlaku dengan lebih dari satu nada (meskipun asumsi kebocoran spektral dapat diabaikan akhirnya rusak).


13
2017-09-12 01:08



Telah disarankan oleh jawaban lain bahwa ada tanggapan frekuensi dalam contoh ini di 950Hz dan 990Hz. Ini adalah kesalahpahaman tentang bagaimana kode FFT menggunakan indeks. Mereka "frekuensi tinggi" paku sebenarnya -50Hz dan -10Hz.

Domain frekuensi memanjang dari -N / 2 * sampling_frequency / N ke + N / 2 * sampling_frequency / N. Tetapi untuk alasan historis, konvensi adalah bahwa N / 2 bagian informasi pertama adalah frekuensi positif, titik tengah adalah frekuensi nol, dan potongan informasi N / 2 terakhir adalah frekuensi negatif dalam urutan terbalik. Untuk spektrum daya, tidak perlu menunjukkan lebih dari 1 + N / 2 informasi pertama.

Konvensi ini sangat membingungkan, karena saya harus memikirkannya dari Press et al. Numerical Recipes dan dengan mengkode Fast Hartley Transform dengan tangan, bertahun-tahun yang lalu ketika saya pertama kali menggunakan FFT, mendahului edisi uji beta Matlab 1.0 yang Cleve Moler pingsan kepada beberapa beruntung mahasiswa doktoral :-)


3
2018-04-24 16:19