%% Compute Modified Periodogram Using Generated C Code
% Create a function periodogram_data.m that returns the modified periodogram power spectral density (PSD) estimate of an input signal using a window. The function specifies a number of discrete Fourier transform points equal to the length of the input signal.

type periodogram_data

% Use codegen to generate a MEX function.
% The %#codegen directive in the function indicates that the MATLAB® code is intended for code generation.
% The -args option specifies example arguments that define the size, class, and complexity of the inputs to the MEX-file. For this example, specify inputData as a 1024-by-1 double precision random vector and window as a Hamming window of length 1024. In subsequent calls to the MEX function, use 1024-sample input signals and windows.
% If you want the MEX function to have a different name, use the -o option.
% If you want to view a code generation report, add the -report option at the end of the codegen command.

codegen periodogram_data -args {randn(1024,1),hamming(1024)}

% Compute the PSD estimate of a 1024-sample noisy sinusoid using the periodogram function and the MEX function you generated. Specify a sinusoid normalized frequency of 2\pi /5 rad/sample and a Hann window. Plot the two estimates to verify they coincide.

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')

% Copyright 2018 The MathWorks, Inc.