Как Спектрум инвертировать дискретизированный аудиосигнал - PullRequest
6 голосов
/ 19 августа 2010

Я ищу простой (псевдо) код, инвертирующий спектр дискретизированного аудиосигнала. В идеале C ++

Код должен поддерживать разные частоты дискретизации (16/32/48 кГц).

Ответы [ 3 ]

7 голосов
/ 08 сентября 2010

Микширование сигнала с помощью Fs/2 поменяет местами высокие и низкие частоты - подумайте о вращении спектра вокруг единичного круга на пол-оборота.Вы можете добиться этого вращения, умножив каждый второй образец на -1.

Микширование на Fs/2 эквивалентно микшированию на exp(j*pi*n).Если x является входом и y выходом,

y[n] = x[n] * exp(j*pi*n) = x[n] * [cos(pi*n) + j*sin(pi*n)]

Это легко упрощается, потому что sin(pi*n) равно 0, а cos(pi*n) чередуется 1, -1.

1 голос
/ 20 августа 2010

Чтобы получить что-то, имеющее такую ​​же временную структуру, что и оригинал, вам необходимо

  • Создать спектрограмму (с некоторым размером окна)
  • Выбрать верхнююи нижние границы частот, которые вы перевернете
  • Отразите интенсивности спектрограммы в этих пределах
  • Повторно синтезируйте звуковой сигнал в соответствии с этими частотами

Поскольку это аудиосигналМаловероятно, что все фазы будут перепутаны.Вы вообще не можете слышать их в любом случае.За исключением переворачивающейся части, ARSS выполняет создание спектрограммы и ресинтез звука.

В противном случае вы можете просто взять БПФ, инвертировать амплитуды компонентов и взять обратное БПФ.Но это будет по существу бессмысленным, так как он полностью зашифрует временную структуру звука, а также частотную структуру.

0 голосов
/ 23 августа 2016

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

так что вы просто умножите все остальные сэмплы на * -1, и все готово.

без задержки, без псевдонимов, без ничего.

...