Создание спектрограммы


10

Я пытался выработать логику для этой задачи и планирую использовать исходный пакет KissFFT для выполнения быстрого преобразования Фурье. Пожалуйста, дайте мне знать, если это выглядит правильно:

  1. Выделить структуру БПФ, т.е. kiss_fft_alloc(N,0,NULL,NULL) Где Nразмер окна я использую. Входной буфер будет массивом Nэлементов типа kiss_fft_scalar. Выходной буфер будет массивом N/2 + 1элементов типа kiss_fft_cpx.
  2. Декодировать N(размер окна) количество образцов PCM.
  3. Для каждой выборки PCM усредните амплитуду каждого канала (выборки без знака) и масштабируйте от 0 до 2 (разделите на 65536,0), сохраняя результат во входном буфере.
  4. Выполните управление окнами (т. Е. Hanning) для входного буфера.
  5. Выполните быстрое преобразование Фурье для входного буфера, сохраняя в выходной буфер. Поскольку я использую реальные значения в качестве входных данных, я могу использовать kiss_fftr().
  6. Для N/2выходных значений получите квадратичную величину преобразованных данных и преобразуйте значения в шкалу дБ по следующей формуле: 10 * log10 (re * re + im * im)
  7. Нанесите N/2значения с шага 6.
  8. Откажитесь от первой половины входного буфера, декодируйте следующие (размер окна / 2) выборки PCM и выполните масштабирование и управление окнами для данных. Это должно эффективно сдвинуть окно ввода и избежать необходимости повторной математической обработки обработанных образцов PCM.
  9. Перейдите к шагу 5, повторяя эти шаги, пока все образцы не будут обработаны.
  10. Освободите использованную память от kiss_fft_alloc().

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

Кроме того, что я должен учитывать при выборе размера окна? Помимо того, что это должно быть четное число согласно инструкциям KissFFT, есть ли преимущество в использовании небольшого размера окна, т.е. это обеспечит лучший график? Я предполагаю, что большой размер окна уменьшает количество БПФ, которые должны быть выполнены, является ли это единственным преимуществом использования большого размера окна?

Икс

Заранее благодарим вас за любые советы, которые вы можете предоставить.

Ответы:


8

Выглядит довольно хорошо для меня. На шаге 3 вы действительно хотите масштабировать сигнал от -1 до 1, иначе вы добавляете DC. Вы упомянули вычитание среднего значения - я бы не рекомендовал делать это для спектрограммы, так как это эффективно отфильтровывает DC, который должна показать спектрограмма, если он там есть.

Выбор размера окна - все о компромиссах. Увеличенное окно даст вам более высокое разрешение по частоте, но более размытое разрешение по времени. Более короткое окно даст вам противоположное: более резкое временное разрешение, но более размытое разрешение по частоте. Соответствующий выбор размера окна будет зависеть от данных, которые вы пытаетесь проанализировать. Как правило, это будет степень 2 только потому, что БПФ, как правило, любят степени 2. Приличное правило заключается в том, что ваше окно должно быть как минимум примерно вдвое длиннее периода наименьшей частоты, который вы хотели бы иметь точно разрешить.

Вы можете задаться вопросом, возможно ли лучше справиться с этим компромиссом, и для этого есть методы: они обычно включают в себя вычисление спектрограмм с несколькими различными размерами БПФ и их комбинирование. На этой веб-странице есть хорошая визуальная информация: http://www.izotope.com/tech/aes_adapt/

Если размер вашего окна слишком мал, две очень близкие частоты могут быть неотличимы друг от друга, так как они оба окажутся в одном бункере FFT. Если размер вашего окна слишком велик, два близких по времени события могут быть объединены, или резкий переходный процесс может превратиться в постепенную атаку. Посмотрите на веб-страницу, которую я разместил, чтобы увидеть некоторые способы визуализации.

Больший размер окна не обязательно уменьшает количество БПФ. Вы решили вычислить спектрограмму, используя кратковременное преобразование Фурье, где есть перекрытие половины размера FFT. Вы можете использовать более высокий коэффициент перекрытия, если хотите. Выбор размера окна - это гораздо больше вопрос компромисса между временем и частотой, чем количество FFT, которое вам нужно вычислить. При проектировании спектрограммы (или любого STFT) вы можете выбрать в качестве независимых параметров размер окна и размер скачка , расстояние между блоками.

Когда вы строите график, время обычно находится на оси x, частота - на оси y (обычно это логарифмическая шкала, шкала Мел и т. Д., А не линейная шкала), а затем величины представляются с интенсивностью цвета, т.е. очень темные цвета соответствуют небольшим величинам, а очень яркие цвета соответствуют большим величинам.


Ваша ссылка кажется мертвой. Не могли бы вы обновить его?
Даниэль Вольф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.