2013-06-23 3 views
0

Я пытаюсь сделать простую свертку двух сигналов. Одним из них является сигналом (музыка, например), а другой является ИК (простая задержка, как такой схеме:.Выполнение работы FUR

IR[0] = 1.0 
IR[1->511] = 0 
IR[512] = 0.5 
IR[513->1023] = 0; 

поэтому он должен сделать небольшое эхо

Я узнал, что в свертке временная область, является умножением в частотной области

, поэтому я хочу взять БПФ обоих сигналов (музыку и ИК) и умножить полученные пары чисел re & im (from re + im * i), затем возьмите iFFT и полюбуйтесь результатом.

fft(fftMusic); 
fft(fftIR); 
for (int i = 0; i < n; i++) 
    fftMusic[i] = fftMusic[i] * fftIR[i]; 
ifft(fftusic); 
for (int i = 0; i < n; i++) 
     fftMusic[i] = fftMusic[i] * 2/double(n); 

Проблема только в том, что она не работает.

Я пробовал как RFDT, так и CFDT, и я получаю странный результат: мой сигнал задерживается, но в обратном. Это вещь FFT?

Первый для RDFT (Real DFT: re in, re & im out), я добавил + n/2 нулевые сэмплы в конце или как музыку, так и IR для свертки, затем использовал 4 перекрытых буфера (это требуемое количество) и рассчитывается, когда настало время БПФ и затем перемножить, то Иффт и т.д.

Второй для CDFT (комплекс ДПФ: повторное & им в & из), я поставил образец музыки каждые два образец (и ноль для мнимой части), затем сделал cdft, умноженный и т. д.

, но оба они не работают и дают тот же результат: странное сочетание звуков с обратным и замедленным звуком.

, пожалуйста, помогите.

  • Элемент списка
+0

Вы должны прочитать [методы перекрытия-добавления/перекрытия-сохранения] (http://en.wikipedia.org/wiki/Overlap-add_method) –

+0

Я уже использую метод overlapp-add, я не знаю, почему ovelapp-save улучшит (может быть, производительность немного) результаты. но все равно спасибо. – IonOne

+0

OK - вы можете использовать либо overlap-add, либо overlap-save, чтобы вы не получали круговую свертку - из вашего вопроса было неясно, хотя вы уже используете overlap-add. Очевидно, проблема кроется в другом месте. –

ответ

0

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

for (int i = 0; i < n; i++) 
    fftMusic[i] = fftMusic[i] * fftIR[i]; 

использование

fftMusic = fftMusic .* fftIR; 

Теперь к вашей проблеме, сделал вы пытаетесь просто простую свертку? И если да, каковы были результаты?

+0

Я не пробовал просто сверлить, я знаю, что это сработает, но это интенсивность процессора, поэтому я отбросил его. – IonOne