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

у меня есть 2 сигнала, один из которых содержит аудиоданные, которые воспроизводятся на динамиках. второй содержит данные микрофона, записывающие динамики одновременно.

что я сделал до сих пор: выравнивание сигналов во временной области с помощью корреляции. примените БПФ к перекрывающейся части обоих сигналов и разделите один на другой, чтобы добиться деконволюции.
что я делаю неправильно, поскольку полученные аудиоданные бесполезны.

вот мой код:

       //put both signals in split complex vectors
       vDSP_ctoz((DSPComplex *)file, 2, &fftFileData, 1, nOver2);
       vDSP_ctoz((DSPComplex *)mic, 2, &fftMicData, 1, nOver2);


        //fft of both file and mic data
        vDSP_fft_zrip(fftSetup, &fftFileData, 1, log2n, FFT_FORWARD);
        vDSP_fft_zrip(fftSetup, &fftMicData, 1, log2n, FFT_FORWARD);


        //divide file data by mic data for deconvolution???
        vDSP_zvdiv(&fftFileData, 1, &fftMicData, 1, &fftMicData, 1, nOver2);  


        //inverse fft of mic-fft-data
        vDSP_fft_zrip(fftSetup, &fftMicData, 1, log2n, FFT_INVERSE);

        //scale back signal
        vDSP_vsmul(fftMicData.realp, 1, &scale, fftMicData.realp, 1, nOver2);
        vDSP_vsmul(fftMicData.imagp, 1, &scale, fftMicData.imagp, 1, nOver2);

        //copy back to float array
        vDSP_ztoc(&fftMicData, 1, (COMPLEX *) result, 2, nOver2);

edit для небольшого пояснения: благодаря @Sammio2 теперь я знаю, что деконволюция очень хорошо описывает мою проблему:

f*g=h

h — мой записанный сигнал, состоящий из

f, мой сигнал, который я хочу восстановить и

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

теперь мне нужно каким-либо образом восстановить f, который является всем звуком, записанным в дополнение к g.

важно: в конце концов мне не нужен четкий сигнал f, просто информация о его громкости или уровне присутствия. в основном уровень шума помимо записанного двустороннего сигнала g.

как мне приступить к сбору информации о желаемом уровне шума?

Я надеюсь, что это поможет понять мою проблему. спасибо пока!


person Maximilian Körner    schedule 27.11.2012    source источник
comment
Похоже, вы можете как-то спутать свертку импульсной характеристики с аддитивным шумом. Бесшумная система будет иметь ненулевую импульсную характеристику.   -  person hotpaw2    schedule 28.11.2012


Ответы (3)


С vDSP_zvsub вы просто выполняете сложное вычитание в каждом бине, что, вероятно, не то, что вам нужно.

Непонятно, чего именно вы пытаетесь достичь, но похоже, что вы хотите вычесть величину одного спектра из другого, и в этом случае вам нужно будет сделать следующее:

  • преобразовать каждый комплексный спектр частотной области из сложного в полярный (величина + фаза)
  • вычесть величины в каждом интервале
  • преобразовать полученные полярные данные обратно в комплексные
person Paul R    schedule 27.11.2012
comment
-1 : Эхо (или другое) подавление требует знания фазы спектра для подавления. Или хотя бы близкое приближение. - person hotpaw2; 27.11.2012
comment
Похоже, OP пытается достичь БПФ-эквивалента деконволюции, чтобы получить импульсную характеристику от заданных звуковых дорожек. - person Sammio2; 27.11.2012
comment
@ hotpaw2: я не вижу упоминания об эхоподавлении в вопросе ОП - я с радостью удалю свой ответ, если вы считаете, что он бесполезен. - person Paul R; 27.11.2012
comment
я только что посмотрел деконволюцию, и это, кажется, именно моя цель: en.wikipedia.org/wiki/Deconvolution f*g=hh — мой записанный сигнал, состоящий из f, моего сигнала, который я хочу восстановить, и g, моего сигнала воспроизведения, записанного дополнительно. в основном f - это шум или дополнительные звуки к моему сигналу воспроизведения в записанном сигнале, и я хочу восстановить f. мой подход неправильный/непрактичный? я продолжаю читать о деконволюции... спасибо за подсказку! - person Maximilian Körner; 28.11.2012

Аргумент длины для vDSP_zvsub — это количество сложных элементов, которые необходимо обработать, а не логарифм числа элементов. Вы должны передать nOver2, а не log2n.

Это просто касается аспекта программирования. Другие ответы касаются проблем с обработкой сигналов. В частности, БПФ является линейным: при заданных сигналах X и Y и константах a и b БПФ(a•X+b•Y) = a•БПФ(X)+b•БПФ(Y). Обратное БПФ также является линейным. Следовательно, обратное БПФ разности БПФ двух сигналов не должно давать результат, отличный от прямого вычитания двух сигналов, за исключением обычных ошибок округления с плавающей запятой.

person Eric Postpischil    schedule 27.11.2012

Вам понадобится импульсная характеристика системы между звуком, отправленным на динамик, и звуком, полученным от микрофона (задержка буферизации ЦАП/АЦП, групповая задержка фильтра сглаживания, отклики динамика и микрофона, скорость звука в воздухе и т. д.) в для создания (в основном) подавляющего сигнала либо во временной области, либо в частотной области. Обратите внимание, что это включает в себя совпадающие амплитуды, а также задержки, и что один набор динамиков или микрофонов вполне может быть «не в фазе» по сравнению с другими.

person hotpaw2    schedule 27.11.2012
comment
я обновил свой вопрос, чтобы быть более точным. это все еще самый простой подход, так как мне нужна информация только о количестве фонового звука или его уровне? у меня есть временная задержка между сигналами через корреляцию. извините за мое непонимание в этой области. Спасибо! - person Maximilian Körner; 28.11.2012