вторник, 2 декабря 2014 г.

БПФ. Подавление акустической обратной связи

Набросал тут на досуге небольшой алгоритм смещения частот для подавления ПОС. Где применимо? Для акустических систем конечно же, в той же электронной музыке для формирования практически всех видов унисонов. А например, в конце 70-х в концертных залах для подавления возбуждения использовался сдвиг частот на электромеханических преобразователях-фазовращателях (сельсинах), на пару герц. Позже появились фазовращатели и на гираторах и механика отошла в прошлое. А в наш век DSP обработка прочно вошла в повседневную жизнь...

Последовательность действий вкратце

Пусть задана частота дискретизации Fd = 44100 Гц и реализуется 512-точечное БПФ (n=512). При этом шаг в спектре составит:

L = Fd / n = 44100 / 512 ~ 86 Гц

Пусть необходимо сдвинуть спектр на 5 Гц:

deltaF = 5 Гц

При этом количество гармоник составит:

N = Fd / deltaF = 44100 / 5 ~ 8820

Теперь очередность преобразования:
  1. Количество разбиений исходного участка L составит Kl = N / n = Fd * deltaF / n = 44100 * 5 / 512 ~ 17
  2. Cоздаем новый массив размерностью N=8820, где каждый 17-й элемент будет заполнен соответствующим i-м элементом исходного массива n=512, а все серединные элементы нулями.
  3. Производим сдвиг всех элементов нового массива на один дискрет, т.е. 5 Гц, исключая нулевой элемент.
  4. Делаем обратное преобразование Фурье (IFFT) над новым массивом со сдвигом для восстановления огибающей, но с более частой нарезкой.
  5. Из полученных 8820 отсчетов огибающей восстановленного сигнала берем Kl-отсчет (т.е. каждый 17-й). Тогда у нас получится буфер той же (исходной размерности), который можно сохранить в файл WAV PCM или воспроизвести сразу из памяти.
Небольшая демонстрация питч-шифтинга:


Как получить сам спектр через Фурье, думаю, пояснять смысла нет. Но по-быстрому на пальцах так:
  1. Имеем, скажем от 4-х периодов выборки.
  2. Производим квантование по 4 (a1, b1, c1, d1 - это один период и т.д.) на период (из условия минимума наложения дополнительных спектров) Fc = 4Fd/ (4*(k+-1)).
  3. Далее выделяем и складываем составляющие SUM (Ai) = a1+a2+a3+a4; SUM (Bi) = b1+b2+b3+b4; и т.д.
  4. Действительная часть Re = SUM (ai) - SUM (ci).
  5. Мнимая часть Im = SUM (bi) - SUM (di).
  6. Квадратуры есть, далее модуль комплексной амплитуды |Z| = SQRT (RE^2 + IM^2).

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.