преобразование Фурье для транспонирования ключа файла WAV - PullRequest
2 голосов
/ 12 апреля 2010

Я хочу написать приложение для транспонирования ключа, который играет wav-файл (для забавы, я знаю, что есть приложения, которые уже делают это) ... мое основное понимание того, как это может быть достигнуто, -

1) нарезать аудиофайл на очень маленькие блоки (скажем, 1/10 секунды)

2) запустить БПФ на каждом блоке

3) сдвиг фазы частотного пространства вверх или вниз в зависимости от того, какую клавишу я хочу

4) использовать обратное БПФ для возврата каждого блока во временную область

5) склеить все блоки вместе

Но теперь мне интересно, если бы преобразованные блоки больше не были непрерывными, когда я пытаюсь склеить их вместе. Есть идеи, как мне это сделать, чтобы гарантировать преемственность, или я просто ни о чем не беспокоюсь?

Ответы [ 4 ]

2 голосов
/ 13 апреля 2010

Для речи вы можете захотеть взглянуть на PSOLA - это популярный алгоритм для pitch-shifting и / или time stretching/compression, который немного сложнее, чем базовый метод наложения-сложения, но не гораздо сложнее.

Если вам нужно обработать неречевые сэмплы, например, музыка, тогда есть несколько возможностей , однако подход FFT / modify / IFFT с перекрытием-добавлением, упомянутый в других ответах, вероятно, является лучшим выбором.

2 голосов
/ 12 апреля 2010

Наложение временных выборок для каждого блока наполовину, так что каждый блок после первого состоит из последних N / 2 выборок из предыдущего блока и N / 2 новых выборок. Обязательно примените какое-то окно к семплам до преобразования.

После смещения частоты выполните обратное БПФ и используйте средние N / 2 выборки из каждого блока. Вам нужно будет отрегулировать окончательное усиление после IFFT.

Конечно, смешивание временных выборок с синусоидальной волной и затем низкочастотная фильтрация также обеспечат такой же сдвиг во временной области. Частота смесителя будет желаемой разностью частот.

1 голос
/ 13 апреля 2010

Найдена эта замечательная статья на эту тему, для всех, кто попробует ее в будущем!

0 голосов
/ 12 апреля 2010

Возможно, вам придется найти нулевой переход между блоками, чтобы склеить отдельные волны вместе. В противном случае вы можете обнаружить, что вы получаете щелчки или щелчки между блоками.

...