Создайте функцию periodogram_data.m
который возвращает модифицированную оценку периодограммы степени спектральной плотности (PSD) входного сигнала с помощью окна. Функция задает количество дискретных точек преобразования Фурье, равное длине входного сигнала.
type periodogram_data
function [pxx,f] = periodogram_data(inputData,window) %#codegen nfft = length(inputData); [pxx,f] = periodogram(inputData,window,nfft); end
Использование codegen
(MATLAB Coder), чтобы сгенерировать MEX-функцию.
The %#codegen
директива в функции указывает, что код MATLAB ® предназначен для генерации кода.
The -args
опция задает аргументы в качестве примера, которые определяют размер, класс и сложность входов в файл MEX. В данном примере задайте inputData
как случайный вектор с двойной точностью 1024 на 1 и window
как Окно Хэмминга длины 1024. В последующих вызовах MEX-функции используйте входные сигналы и окна с 1024 дискретизацией.
Если вы хотите, чтобы MEX-функция имела другое имя, используйте -o
опция.
Если необходимо просмотреть отчет генерации кода, добавьте -report
опция в конце codegen
команда.
codegen periodogram_data -args {randn(1024,1),hamming(1024)}
Code generation successful.
Вычислите оценку PSD шумной синусоиды с 1024 образцом, используя функцию периодограммы и MEX-функцию, которую вы сгенерировали. Задайте синусоидальную нормированную частоту рад/образец и окно Ханна. Постройте график двух оценок, чтобы убедиться, что они совпадают.
N = 1024; x = 2*cos(2*pi/5*(0:N-1)') + randn(N,1); periodogram(x,hann(N)) [pxMex,fMex] = periodogram_data(x,hann(N)); hold on plot(fMex/pi,pow2db(pxMex),':','Color',[0 0.4 0]) hold off grid on legend('periodogram','MEX function')