Первый шаг - убедиться, что ваша начальная частота дискретизации и целевая частота дискретизации являются рациональными числами . Поскольку они являются целыми числами, они автоматически являются рациональными числами. Если бы один из них не был рациональным числом, все равно можно было бы изменить частоту дискретизации, но это очень другой процесс и более сложный.
22∗ 32∗ 52∗ 7227∗ 5332∗ 7225∗ 5
Предыдущие шаги должны быть выполнены независимо от того, как вы хотите выполнить повторную выборку данных. Теперь поговорим о том, как это сделать с помощью БПФ. Хитрость повторной выборки с помощью БПФ состоит в том, чтобы выбирать длины БПФ, чтобы все работало хорошо. Это означает выбор длины FFT, кратной скорости прореживания (в данном случае 441). Для примера давайте выберем длину БПФ 441, хотя мы могли бы выбрать 882, или 1323, или любое другое положительное кратное 441.
Чтобы понять, как это работает, это помогает визуализировать это. Вы начинаете с аудиосигнала, который в частотной области выглядит примерно так, как показано на рисунке ниже.
Когда вы закончите обработку, вы захотите уменьшить частоту дискретизации до 16 кГц, но вам нужно как можно меньше искажений. Другими словами, вы просто хотите сохранить все от изображения выше от -8 кГц до +8 кГц и отбросить все остальное. Это приводит к изображению ниже.
Обратите внимание, что частоты выборки не в масштабе, они просто для иллюстрации концепций.
25∗ 5
Как вы можете подозревать, есть несколько потенциальных проблем. Я пройду через каждого и объясню, как вы можете их преодолеть.
Что вы делаете, если ваши данные не являются кратным коэффициента прореживания? Вы можете легко преодолеть это, заполнив конец ваших данных достаточным количеством нулей, чтобы сделать его кратным коэффициенту прореживания. Данные дополняются ДО того, как они БПФ.
Lл - 1нули (обратите внимание, что количество выборок данных и количество выборок заполнения должны ОБА положительно кратно коэффициенту прореживания - вы можете увеличить длину заполнения, чтобы удовлетворить этому ограничению), FFT'ит заполненные данные, умножая частотную область данные и фильтр, а затем наложение высокочастотных (> 8 кГц) результатов на низкочастотные (<8 кГц) результаты, прежде чем отбрасывать высокочастотные результаты. К сожалению, поскольку фильтрация в частотной области сама по себе является большой темой, я не смогу более подробно остановиться на этом ответе. Я скажу, однако, что если вы фильтруете и обрабатываете данные более чем в одном блоке, вам нужно будет реализовать Overlap-and-Add или Overlap-and-Save, чтобы сделать фильтрацию непрерывной.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ. Разница между начальным числом выборок в частотной области и целевым числом выборок в частотной области должна быть равномерной, чтобы можно было удалить то же количество выборок с положительной стороны результатов, что и с отрицательной стороны результатов. В нашем примере начальным числом выборок была частота прореживания, или 441, а целевым числом выборок была скорость интерполяции, или 160. Разница составляет 279, что не является четным. Решение состоит в том, чтобы удвоить длину FFT до 882, что приводит к удвоению целевого числа выборок до 320. Теперь разница четная, и вы можете без проблем отбрасывать соответствующие выборки в частотной области.