Почему результаты встроенной функции MATLAB отличаются от результатов, которые я получаю, когда сам определяю функцию, используя то же выражение? - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время я делаю спектральный анализ некоторого сигнала в Matlab и должен использовать оконную функцию Хемминга (https://www.mathworks.com/help/signal/ref/hamming.html) для дальнейшего анализа того же сигнала, но у меня возникла необычная проблема, когда я получаю неправильный результаткогда я использую встроенную функцию Хемминга (L) и получаю правильный результат, когда я просто сам пишу функцию так же, как это определено в MATLAB. Вот код:

%This is a signal i am analyzing and it has N points.
F1 = 55/450;
F2 = 67/450;
N = 450;
n = 0:(N-1);
x = 50*cos(2*pi*F1*n)+100*cos(2*pi*F2*n)

% Here is the code for plotting the signal in N points
figure
n = 0:(N-1);
stem(n,x);
xlabel('n');
ylabel('x[n]');
title('Discrete Signal x[n]');
pause

% Here i am using a built in function. It is of length N, the same as x[n].
n=0:(N-1);
window1 = hamming(N);
figure
y1 = x.*window1; %The proper way of windowing a function.
stem(n, y1);
title('Windowed Discrete Signal y[n]');
pause
% This yields some nonsensical graph even though the window function itself graphs properly. 

% Here i looked at the expression on the site which is used for the built-in matlab function and wrote it myself.
n=0:(N-1);
window2 = 0.54-0.46*cos(2*pi*n./N);
figure
y2 = x.*window2;
stem(n, y2);
title('Windowed Discrete Signal y[n]');
pause
% Here it graphs everything perfectly.

Вотизображение графика, который я получаю, когда сам пишу функцию: Правильная оконная функция А вот то, что я получаю, когда использую встроенную функцию: Ерундовая функция

Вывод заключается в том, что я не понимаю, как это работает при умножении сигналов. Можете ли вы помочь мне понять, почему и как я должен изменить функцию для работы?

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема в window1, возвращаемом hamming, является вектором Nx1, в то время как x является вектором 1xN.Когда вы выполняете поэлементное умножение на них, оно даст матрицу N*N.Смотрите пример ниже.Вы получите желаемые результаты, если измените форму либо window1, либо x, чтобы они соответствовали форме (например, y1 = x.*window1';)

>> a = [1 2 3]

a =

     1     2     3

>> b = [1; 2; 3]

b =

     1
     2
     3

>> a.*b

ans =

     1     2     3
     2     4     6
     3     6     9
...