Я выбрал голосовое аудио, сначала выполнив БПФ, затем взяв только те части результата, которые мне нужны, и затем выполнив обратное БПФ. Тем не менее, он работает должным образом только тогда, когда я использую частоты, которые обе имеют степень двойки, скажем, понижающую дискретизацию с 32768 до 8192. Я выполняю БПФ для данных 32k, отбрасываю верхние 3/4 данных и затем выполняю обратное БПФ на оставшиеся 1/4.
Однако всякий раз, когда я пытаюсь сделать это с данными, которые не совпадают должным образом, происходит одно из двух: библиотека математики, которую я использую (Aforge.Math), выбрасывает соответствие, потому что мои образцы не имеют степени двойки. Если я попытаюсь заполнить сэмплы нулями, чтобы они стали степенью двойки, на другом конце это вылетит. Я также попытался использовать DFT вместо этого, но в итоге он оказался безумно медленным (это нужно делать в режиме реального времени).
Как бы я собирался правильно обнулить данные FFT, как на начальном, так и на обратном FFT в конце? Предполагая, что у меня есть сэмпл с частотой 44,1 кГц, который должен быть на 16 кГц, я сейчас пробую что-то вроде этого, сэмпл размером 1000.
- Pad вводит данные до 1024 в конце
- Выполнить БПФ
- Считайте первые 512 элементов в массив (мне нужны только первые 362, но нужны ^ 2)
- Выполнить обратное БПФ
- Считайте первые 362 элемента в буфер воспроизведения аудио
Из этого я получаю мусор в конце. Выполнение того же действия, но без необходимости дополнения на шаге 1 и 3 из-за сэмплов, уже являющихся ^ 2, дает правильный результат.
Ответы:
Первый шаг - убедиться, что ваша начальная частота дискретизации и целевая частота дискретизации являются рациональными числами . Поскольку они являются целыми числами, они автоматически являются рациональными числами. Если бы один из них не был рациональным числом, все равно можно было бы изменить частоту дискретизации, но это очень другой процесс и более сложный.
Предыдущие шаги должны быть выполнены независимо от того, как вы хотите выполнить повторную выборку данных. Теперь поговорим о том, как это сделать с помощью БПФ. Хитрость повторной выборки с помощью БПФ состоит в том, чтобы выбирать длины БПФ, чтобы все работало хорошо. Это означает выбор длины FFT, кратной скорости прореживания (в данном случае 441). Для примера давайте выберем длину БПФ 441, хотя мы могли бы выбрать 882, или 1323, или любое другое положительное кратное 441.
Чтобы понять, как это работает, это помогает визуализировать это. Вы начинаете с аудиосигнала, который в частотной области выглядит примерно так, как показано на рисунке ниже.
Когда вы закончите обработку, вы захотите уменьшить частоту дискретизации до 16 кГц, но вам нужно как можно меньше искажений. Другими словами, вы просто хотите сохранить все от изображения выше от -8 кГц до +8 кГц и отбросить все остальное. Это приводит к изображению ниже.
Обратите внимание, что частоты выборки не в масштабе, они просто для иллюстрации концепций.
Как вы можете подозревать, есть несколько потенциальных проблем. Я пройду через каждого и объясню, как вы можете их преодолеть.
Что вы делаете, если ваши данные не являются кратным коэффициента прореживания? Вы можете легко преодолеть это, заполнив конец ваших данных достаточным количеством нулей, чтобы сделать его кратным коэффициенту прореживания. Данные дополняются ДО того, как они БПФ.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ. Разница между начальным числом выборок в частотной области и целевым числом выборок в частотной области должна быть равномерной, чтобы можно было удалить то же количество выборок с положительной стороны результатов, что и с отрицательной стороны результатов. В нашем примере начальным числом выборок была частота прореживания, или 441, а целевым числом выборок была скорость интерполяции, или 160. Разница составляет 279, что не является четным. Решение состоит в том, чтобы удвоить длину FFT до 882, что приводит к удвоению целевого числа выборок до 320. Теперь разница четная, и вы можете без проблем отбрасывать соответствующие выборки в частотной области.
источник
Хотя приведенный выше ответ действительно завершен:
Вот суть этого:
Подробности об этом:
http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf
Кроме того: если только это не является абсолютно необходимым, НЕ компьютер FFT, чтобы затем вычислить IFFT. Это невероятно медленный процесс и считается неподходящим для большинства задач обработки сигналов. БПФ обычно используется для анализа проблемы или применения обработки сигнала только в частотной области.
источник
Как говорил Бьорн Рош, использование БПФ для этого было бы крайне неэффективно. Но здесь все идет очень просто, используя метод фильтра сглаживания и сглаживания в частотной области.
1 - принять желаемый векторный сигнал длины N.
2 - Выполнить N точку БПФ.
3 - Нулевое заполнение FFT с 160 * N нулями в середине вектора FFT.
4 - Выполнить IFFT
5 - Выберите один из 441 образцов, отбрасывая остальные 440.
У вас останется вектор длиной N * 160/441, который будет вашим преобразованным сигналом.
Как видите, вы делаете много бессмысленных вычислений, потому что большая часть результатов будет отброшена. Но если у вас есть доступ к коду, выполняющему FFT, вы можете немного его настроить, чтобы он вычислял только результаты IFFT, которые вы получите, а не те, которые вы выбросите.
Надеюсь, поможет.
источник