2010-04-12 5 views
1

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

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

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

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

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

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

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

ответ

2

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

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

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

+0

Я думаю, что микшер, вероятно, больше того, что ищет ОП. Но если есть задействованный фильтр, трюк FFT с перекрытием-сбрасыванием действительно хорош. См. Http://en.wikipedia.org/wiki/Overlap-save_method для получения более подробной информации. Если вы все сделаете правильно, вам также не потребуется окно - окно больше для приложений анализа. – mtrw

+0

@larry Я не вижу, как это устраняет разрыв. Похоже, что результирующие сигналы обычно не соответствуют фазе с прошлым блоком. Что касается частотного смешивания синусоидальной волны, я не знаком с этим подходом. – tbischel

+0

@mtrw спасибо за ссылку, я просмотрю ее – tbischel

0

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

+0

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

1

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

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

+1

У меня сложилось впечатление, что PSOLA - это прежде всего речь, а не музыка. Это верно? – tom10

+0

@ tom10: хорошая точка - я не знаю, как хорошо это работает, например. Музыка.Я предполагаю, что более базовый подход с перекрытием-добавлением может быть более уместным, если это относится к приложению, отличному от речи. Я отредактирую свой ответ соответственно. –