2014-02-18 4 views
3

Согласно теореме свертки свертка во временной области является произведением в fft-области. При правильной нулевой обивке, она работает:Точечный продукт с fft

% convolution in time domain 
a = [1 2 3]; 
b = [4 5 6]; 
c = conv(a,b); 

a_padded=[a 0 0]; b_padded=[b 0 0]; 
c_bis=ifft(fft(a_padded).*fft(b_padded)); 
% we do find c_bis=c 

Однако эта теорема suposed работать наоборот, а также, продукт в области времени является сверткой в ​​области FFT. Я не получу эту часть:

d = a.*b; 
D=conv(fft(a_padded),fft(b_padded)); 
d_bis=ifft(D); 

Это дает комплексный вектор для d_bis. Как можно инвертировать точечный продукт, созданный во временной области с использованием свертки в частотной области?

ответ

4

Интересный вопрос!

Ошибка (хотя тонкий один), когда вы говорите

продукт в области времени является сверткой в ​​области FFT

Это верно с трансформирует Фурье. С Discrete Fourier transforms (ДПФ или БПФ), то correct formulation является

Продукт во временной области представляет собой кругового свертки в домене FFT, делится на длину последовательности

Таким образом, вы необходимо изменить это значение в вашем d_bis расчетах:

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

Если у вас есть набор инструментов обработки сигнала можно использовать cconv для вычисления круговой свертки:

N = length(a); 
D = cconv(fft(a),fft(b), N)/N; 
d_bis=ifft(D); %// now this equals d 

Чтобы убедиться, в correct formulation в первом случае (свертка во временной области дает продукт в частотной области) также включает циркуляр свертка:

круговой свертка во временной области является продуктом в области FFT

(без разделения по длине последовательности в данном случае)

Но так как вы заполняться нулями во временной области, разница между нормальная и круговая свертка исчезает, и вы получаете правильный результат. Без прокладки, это будет:

c = cconv(a, b, N); 
c_bis=ifft(fft(a).*fft(b)); %// this equals c 
Смежные вопросы