Як отримати частоти кожного значення у FFT?


148

У мене результат FFT. Вони зберігаються у двох doubleмасивах: масив реальних частин та масив уявної частини. Як визначити частоти, які відповідають кожному елементу в цих масивах?

Іншими словами, я хотів би створити масив, який зберігає частоти для кожного реального і уявного компонента мого FFT.


Я роблю це в C # .net. Можеш допомогти мені?
Ранго

9
Якщо ви не розумієте актуальності реальних та уявних частин FFT, тоді ви не отримаєте жодних значущих результатів, тому вам слід розшукати кілька навчальних посібників з FFT та обробки сигналів, щоб зрозуміти, як інтерпретувати результати. Я думаю, що цілком ймовірно, що для чого б ви не користувалися, ви хочете масштабу FFT або спектральної щільності потужності.
the_mandrill

Дякую! Я хочу отримати пікові частоти кожного кадру (довжина кадру залежить від довжини вікна та довжини зсуву)
Rango

Відповіді:


350

Перший бін в БПФ постійного струму (0 Гц), другий бункер Fs / N, де Fsце частота дискретизації , і Nце розмір БПФ. Наступний смітник 2 * Fs / N. Щоб висловити це в загальних рисах, n-й бін є n * Fs / N.

Отже, якщо ваша швидкість вибірки, Fsскажімо, 44,1 кГц, а ваш розмір FFT Nстановить 1024, то вихідні відходи FFT знаходяться на рівні:

  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

Зверніть увагу, що для реального вхідного сигналу (уявні частини всі нульові) друга половина FFT (відсіки від N / 2 + 1до N - 1) не містить корисної додаткової інформації (вони мають складну сполучену симетрію з першими N / 2 - 1бункерами). Останній корисний бункер (для практичних застосувань) знаходиться на рівні N / 2 - 1, що відповідає 22006,9 Гц у наведеному вище прикладі. Бін at N / 2представляє енергію на частоті Найкіста, тобто Fs / 2(= 22050 Гц в цьому прикладі), але це, як правило, не має жодного практичного використання, оскільки фільтри, що згладжують, зазвичай послаблюють будь-які сигнали в і вище Fs / 2.


8
Зауважте - відповідь трохи невірний - 512-е відро містить рівень для 22050, межа найквіст. У бункерах від 0 до N / 2 включено корисні значення.
Девід ван Брінк

4
Дякую за редагування та уточнення ... Я думаю, саме тут я виявляю деяку недолік практичності. Я: Але майстер, робота FFT до никвіста! Ви: Падаван, ви дійсно повинні це відфільтрувати.
Девід ван Брінк

5
Я б хотів, щоб я міг відповісти зірками. Ця відповідь навіть краща за вихідне запитання!
Скіліон

14
@PaulR - Я хотів би подякувати вам за цю чудову відповідь, яка служила мені протягом багатьох років. Я б відвідав цю відповідь, перш ніж у мене був обліковий запис StackOverflow, і я фактично забув про подяку, коли я зареєструвався. Нещодавно я дивився на речі про FFT, і я згадав вашу відповідь і щойно відвідав її. Одного разу я потрапив сюди, я згадав подякувати вам ... тож дякую! Кожен раз, коли у мене з кимось виникають дебати щодо тлумачення того, що таке кожна точка на горизонтальній осі FFT, я просто вказую їх на це посилання.
rayryeng

6
@rayryeng: велике спасибі - я думаю, що це найприємніше визнання, яке я коли-небудь мав за ~ 5 років, відповідаючи на запитання тут!
Пол Р

55

Подивіться на мою відповідь тут .

Відповідь на коментар:

БПФ фактично обчислює взаємну кореляцію вхідного сигналу з синусом і косинусом (базисні функції) в діапазоні частот , рівномірно розподілені. Для даного виходу FFT є відповідна частота (F), як задано у відповіді, яку я розмістив. Реальною частиною вихідної вибірки є поперечна кореляція вхідного сигналу з, cos(2*pi*F*t)а уявна частина - це поперечна кореляція вхідного сигналу з sin(2*pi*F*t). Причина вхідного сигнал корелює з sinі cosфункціями є для обліку різниці фаз між вхідним сигналом і базисними функціями.

Беручи величину складного виходу FFT, ви отримуєте міру того, наскільки добре вхідний сигнал корелює з синусоїдами на наборі частот незалежно від фази вхідного сигналу. Якщо ви просто аналізуєте вміст частоти сигналу, ви майже завжди будете приймати квадрати або величину від складного виходу FFT.


Реальна і уявна частина - результат FFT, який використовується для? Будь ласка, поясніть мені. Дякую
Ранго

5
ця відповідь заслуговує більшої любові.
яскрава зірка

1
Чи може бути, що величина складних виходів повинна бути подвоєна кожен? (якщо я обмежую своє тлумачення нижньою половиною)
Вовк

18

Я використав наступне:

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

Вхідні дані:

  • i: Бін для доступу
  • samples: Частота дискретизації в герцах (тобто 8000 Гц, 44100 Гц тощо)
  • nFFT: Розмір вектора FFT

7
Люди не можуть точно знати, що ви представляєте з samplesабо nFFT. Тому, будь ласка, зробіть це більш пояснювальним.
mostar

14
У прийнятій відповіді сказано, що так і має бути i * samples / nFFT. Чому додаткове 2там? Я щось пропускаю?
yati sagade

13

Вихідні коефіцієнти FFT (для комплексного введення розміру N) становлять від 0 до N - 1, згруповані як [LOW, MID, HI, HI, MID, LOW] частоти.

Я вважаю, що елемент k має ту саму частоту, що й елемент у Nk, оскільки для реальних даних FFT [Nk] = складний кон'югат FFT [k].

Порядок сканування від низької до високої частоти

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

Є [N / 2] +1 групи частоти від індексу i = 0 до [N / 2], кожна з яких має frequency = i * SamplingFrequency / N

Отже, частота в bin FFT [k] становить:

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

5

Частота результату вашого k- го FFT становить 2 * pi * k / N.


6
Я думаю, це буде в радіанах
Барнабі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.