Как проверить теорему свертки в MATLAB? Мой результат неверен - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь проверить теорему свертки в MATLAB. У меня есть сигнал под названием sine_big_T. Тогда у меня есть фильтр с именем W. W и sine_big_T имеют одинаковую длину.

Теорема о свертке говорит, что fft(sine_big_T.*W) должно быть таким же, как свертка fft(sine_big_T) с fft(W).

Я совершенно запутался в этой теореме. fft(sine_big_T.*W) даст мне массив с длиной length(sine_big_T). Однако conv(fft(sine_big_T), fft(W)) дает мне массив с длиной length(sine_big_T) + length(W) - 2. Я пробовал комменд conv(fft(sine_big_T), fft(W), 'same'), но результат все еще сильно отличается от fft(sine_big_T.*W).

T = 128;
big_T = 8*T;
small_T = T/8;
sine_big_T = zeros(1,129);
sine_small_T = zeros(1,129);
W = zeros(1,129);
for i = 0:T
    sine_big_T(1, i+1) = sin(2*pi/big_T*i);
    W(1, i + 1) = 1 - cos(2*pi/T * i);
end


figure
plot(1:129,fft(sine_big_T.*W));

I_fft = fft(sine_big_T);
W_fft = fft(W);
test = conv(I_fft, W_fft,'same');
figure
plot(1:length(I_fft), test)

Из теоремы два графика должны выглядеть одинаково. Но результат даже не близко. Я думаю, что я использую conv не правильно. Как правильно проверить теорему?

1 Ответ

3 голосов
/ 12 апреля 2019

Использование conv с 'same' является правильным.Вы видите две вещи:

  1. fft определяет источник в первом элементе массива, а не в середине домена.Это не очень хорошо с conv.Используйте это вместо этого:

    test = ifftshift( conv( fftshift(I_fft), fftshift(W_fft), 'same' ) );
    

    Функция fftshift перемещает начало координат в середину массива, где это хорошо для conv с 'same', а ifftshift перемещает начало координат назад кпервый элемент.

  2. Нормализация.БПФ обычно нормализуется, так что умножение в частотной области является сверткой в ​​пространственной области.Поскольку вы вычисляете свертку в частотной области, нормализация отключена.Чтобы исправить нормализацию, построите

    plot(1:129,fft(sine_big_T.*W)*length(W));
    
...