Làm cách nào để có được tần số của từng giá trị trong FFT?


148

Tôi có kết quả FFT. Chúng được lưu trữ trong hai doublemảng: mảng phần thực và mảng phần ảo. Làm cách nào để xác định tần số tương ứng với từng phần tử trong các mảng này?

Nói cách khác, tôi muốn tạo một mảng lưu trữ tần số cho từng thành phần thực và ảo trong FFT của tôi.


Tôi làm điều đó trong C # .net. Bạn có thể giúp tôi được không?
Rango

9
Nếu bạn không hiểu mức độ liên quan của phần thực và phần ảo của FFT thì bạn sẽ không nhận được bất kỳ kết quả có ý nghĩa nào, vì vậy bạn nên tìm hiểu một số hướng dẫn xử lý tín hiệu và FFT để hiểu cách diễn giải kết quả. Tôi nghĩ rằng rất có thể là bất cứ điều gì bạn đang sử dụng nó cho, bạn đều muốn độ lớn của FFT hoặc Mật độ phổ năng lượng.
the_mandrill

Cảm ơn bạn! Tôi muốn nhận tần số cao nhất của từng khung hình (độ dài khung hình phụ thuộc vào Độ dài cửa sổ và Độ dài thay đổi)
Rango

Câu trả lời:


350

Thùng thứ nhất trong FFT là DC (0 Hz), thùng thứ hai là Fs / N, trong đó Fstỷ lệ mẫu và Nlà kích thước của FFT. Thùng tiếp theo là 2 * Fs / N. Để diễn đạt điều này theo thuật ngữ chung, thùng thứ nn * Fs / N.

Vì vậy, nếu tốc độ mẫu của bạn, Fsgiả sử là 44,1 kHz và kích thước FFT của bạn, Nlà 1024, thì các thùng đầu ra FFT nằm ở:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Lưu ý rằng đối với tín hiệu đầu vào thực (phần ảo là 0), nửa sau của FFT (thùng từ N / 2 + 1đến N - 1) không chứa thông tin bổ sung hữu ích (chúng có đối xứng phức hợp với các N / 2 - 1thùng thứ nhất ). Thùng hữu ích cuối cùng (cho các ứng dụng thực tế) là tại N / 2 - 1, tương ứng với 22006,9 Hz trong ví dụ trên. Thùng tại N / 2đại diện cho năng lượng ở tần số Nyquist, nghĩa là Fs / 2(= 22050 Hz trong ví dụ này), nhưng nói chung đây không phải là sử dụng thực tế, vì các bộ lọc khử răng cưa thường sẽ làm giảm bất kỳ tín hiệu nào ở trên và trên Fs / 2.


8
Lưu ý - câu trả lời hơi sai - thùng thứ 512 chứa mức cho 22050, giới hạn nyquist. Các thùng từ 0 đến N / 2 đã bao gồm các giá trị hữu ích.
david van brink

4
Cảm ơn đã chỉnh sửa & làm rõ ... Tôi đoán đây là nơi tôi tiết lộ một số thiếu thực tế. Tôi: Nhưng chủ nhân, công việc của FFT lên đến người theo chủ nghĩa hư vô! Bạn: Padawan, bạn thực sự nên lọc nó ra.
david van brink

5
Tôi ước tôi có thể sao câu trả lời. Câu trả lời này thậm chí còn tốt hơn câu hỏi ban đầu!
Skylion

14
@PaulR - Tôi muốn cảm ơn bạn vì câu trả lời tuyệt vời này đã phục vụ tôi trong nhiều năm qua. Tôi sẽ truy cập câu trả lời này trước khi tôi có tài khoản StackOverflow và tôi thực sự đã quên cảm ơn bạn khi tôi đăng ký. Gần đây tôi đã xem qua các công cụ FFT và tôi nhớ câu trả lời của bạn và chỉ cần truy cập nó bây giờ. Khi tôi đến đây, tôi nhớ cảm ơn bạn ... rất cảm ơn bạn! Bất cứ khi nào tôi có một cuộc tranh luận với ai đó về việc diễn giải từng điểm trên trục hoành của FFT là gì, tôi chỉ cần trỏ chúng vào liên kết này.
rayryeng

6
@rayryeng: cảm ơn bạn rất nhiều - Tôi nghĩ đó là sự thừa nhận đẹp nhất tôi từng có trong ~ 5 năm trả lời các câu hỏi ở đây trên SO!
Paul R

55

Hãy xem câu trả lời của tôi ở đây .

Trả lời để bình luận:

FFT thực sự tính toán mối tương quan chéo của tín hiệu đầu vào với các hàm sin và cos (hàm cơ bản) ở một dải tần số cách đều nhau. Đối với một đầu ra FFT nhất định, có một tần số tương ứng (F) như được đưa ra bởi câu trả lời tôi đã đăng. Phần thực của mẫu đầu ra là tương quan chéo của tín hiệu đầu vào với cos(2*pi*F*t)và phần ảo là tương quan chéo của tín hiệu đầu vào với sin(2*pi*F*t). Lý do tín hiệu đầu vào tương quan với sinvà các coschức năng là để tính đến sự lệch pha giữa tín hiệu đầu vào và các chức năng cơ bản.

Bằng cách lấy độ lớn của đầu ra FFT phức tạp, bạn sẽ có được một thước đo về mức độ tín hiệu đầu vào tương quan với các giá trị sin ở một tập hợp tần số bất kể pha tín hiệu đầu vào. Nếu bạn chỉ phân tích nội dung tần số của tín hiệu, hầu như bạn sẽ luôn lấy độ lớn hoặc độ lớn bình phương của đầu ra phức tạp của FFT.


Phần thực và phần ảo là kết quả của FFT được sử dụng cho? Hãy giải thích cho tôi. Cảm ơn bạn
Rango

5
Câu trả lời này xứng đáng được yêu thương nhiều hơn.
ngôi sao sáng

1
Có thể là độ lớn của các đầu ra phức tạp phải được nhân đôi mỗi? (nếu tôi giới hạn cách giải thích của mình ở nửa dưới)
Sói

18

Tôi đã sử dụng như sau:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

Các đầu vào là:

  • i: Thùng để truy cập
  • samples: Tốc độ lấy mẫu tính bằng Hertz (tức là 8000 Hz, 44100Hz, v.v.)
  • nFFT: Kích thước của vectơ FFT

7
Mọi người không thể biết chính xác những gì bạn đại diện với sampleshoặc nFFT. Vì vậy, xin vui lòng làm cho nó giải thích nhiều hơn.
mostar

14
Câu trả lời được chấp nhận nói rằng điều này nên được i * samples / nFFT. Tại sao có thêm 2ở đó? Tui bỏ lỡ điều gì vậy?
yati sagade

13

Các hệ số đầu ra FFT (đối với đầu vào phức tạp có kích thước N) nằm trong khoảng từ 0 đến N - 1 được nhóm thành tần số [THẤP, TRUNG, HI, HI, TRUNG, THẤP].

Tôi sẽ xem xét rằng phần tử tại k có cùng tần số với phần tử tại Nk vì đối với dữ liệu thực, FFT [Nk] = liên hợp phức tạp của FFT [k].

Thứ tự quét từ tần số THẤP đến CAO là

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

Có [N / 2] +1 nhóm tần số từ chỉ số i = 0 đến [N / 2], mỗi nhóm có frequency = i * SamplingFrequency / N

Vì vậy, tần số tại bin FFT [k] là:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

5

Tần số kết quả FFT thứ k của bạn là 2 * pi * k / N.


6
Tôi đoán đây sẽ là radian
Barnaby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.