Определение длины БПФ - PullRequest
       30

Определение длины БПФ

4 голосов
/ 15 ноября 2011

Я работаю над инструментом для сравнения двух волновых файлов на предмет сходства их волновых форм.Например, у меня есть волновой файл длительностью 1 минута, и я создаю другой волновой файл, используя первый, но каждые 5 секунд делаю данные с интервалом от 5 секунд до 0. Теперь мое программное обеспечение скажет, что есть разница в форме волны в интервале времени от 5 секунд до 10 секунд., От 15 секунд до 20 секунд, от 25 секунд до 30 секунд и так далее ...

На данный момент, при начальной разработке, это работает нормально.Ниже приведены три набора тестов:

  1. У меня есть два волновых файла с частотой дискретизации 960 Гц, моно, без сэмплов данных, как 138551 (файлы arnd 1 мин и 12 с).Я использую 128-точечное БПФ (разделение файла на порцию 128 сэмплов), и результаты хорошие.

  2. Когда я использую тот же алгоритм для волновых файлов с частотой дискретизации 48 кГц, 2-канальный безвыборок данных 6927361 для каждого канала (файл 2 мин 24 с), процесс становится слишком медленным.Когда я использую БПФ с 4096 точками, процесс получается лучше.

  3. Но, БПФ с 4096 точками для файлов с частотой 22050 Гц, 2 канала с числом выборок данных 55776 для каждого канала (и 0,6sec file) дает очень плохие результаты.В этом случае БПФ с 128 точками дает хороший результат.

Итак, я запутался в том, как определить длину БПФ, чтобы мои результаты были хорошими в каждом случае.

Я думаю, что длина должна зависеть от количества образцов и частоты дискретизации.Пожалуйста, оставьте свой вклад в это.

Спасибо

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

Длина БПФ, N, будет определять разрешение в частотной области:

resolution (Hz) = sample_rate (Hz) / N

Так, например, в случае (1) у вас есть resolution = 960 / 128 = 7.5 Hz.Таким образом, каждый bin в результирующем БПФ (или предположительно полученный из этого спектр мощности) будет иметь ширину 7,5 Гц, и вы сможете различать частотные составляющие, которые, по крайней мере, так далеко друг от друга.

Поскольку вы не говорите, что это за формы волны или какова цель вашего приложения, трудно понять, какое разрешение вам нужно.

Еще один важный момент - многие люди используютБПФ впервые не знают, что в целом вам необходимо применить оконную функцию до БПФ, чтобы избежать спектральной утечки .

1 голос
/ 26 марта 2012

Я должен сказать, что нашел ваш вопрос очень загадочным. Я думаю, что вы должны посмотреть на кратковременное преобразование Фурье. Причина, по которой я это говорю, заключается в том, что вы смотрите на довольно большое количество выборок, если используете частоту дискретизации 44,1 кГц в течение 2 минут с 2 каналами. Один FFT на всю сумму действительно займет довольно много времени, не говоря уже о том, что оценка будет смещена, так как среднее значение сигналов и дисперсия будут сильно меняться в течение всей продолжительности. Чтобы избежать этого, сначала необходимо сформировать сигнал во временной области, эти кадры могут быть размером от 20 мс до 40 мс (обычно используется для речи) и часто перекрываются ( Уэлч-метод спектральной оценки ). Затем вы применяете оконную функцию, такую ​​как окно Хэмминга или Хеннинга, чтобы уменьшить спектральную утечку и вычислять N-точечное fft для каждого кадра. Где N - следующая степень двух выше числа выборок в этом кадре. Например:

  1. Fs = 8 кГц, одноканальный;
  2. время = 120 с;
  3. no_samples = time * Fs = 960000;
  4. длина кадра T_length = 20 мс;
  5. длина кадра в выборках N_length = 160;
  6. перекрытие кадра T_overlap = 10 мс;
  7. перекрытие кадров в выборках N_overlap = 80;
  8. Num кадров N_frames = (no_samples - (N_length-N_overlap)) / N_overlap = 11999;
  9. длина БПФ = 256;

Таким образом, вы будете обрабатывать в общей сложности 11999 кадров, но длина вашего БПФ будет небольшой. Вам понадобится только БПФ длиной 256 (следующая степень двух выше длины кадра 160). Большинство алгоритмов, которые реализуют БПФ, требуют, чтобы длина сигнала и длина БПФ были одинаковыми. Все, что вам нужно сделать, это добавить нули к вашему кадрированному сигналу до 256. Поэтому дополняйте каждый кадр x количеством нулей, где x = FFT_length-N_length. Мое последнее приложение для Android делает это на записанной речи и использует краткосрочные данные БПФ для отображения спектрограммы речи, а также выполняет различные спектральные модификации и фильтрацию, которая называется Улучшение речи для Android

...