Electrical – Demodulate a AM signal from the carrier using Matlab

amdemodulationdigital modulationMATLABsignal processing

So the AM signal has a bandwidth of 5kHz and the carrier signal is 100kHz.
I demodulate the AM signal by multiplying it to a sin function (sin(2000000*pi), same frequency with the carrier frequency).

This is my take in Matlab for the ideal:

%read in the audio
[y,Fs]=audioread('Signal1.wav');
[gt,fs]=audioread('Signal1_gt.wav');

%demodulation
for t=1:1:size(y,1)
    x=sin(200000*pi*(t/Fs));
    y(t,1)=y(t,1)*x;
    y(t,2)=y(t,2)*x;
end

%low pass filter
h=10*sinc(10*(-10:10));
y1=filter(h,1,y);

%down sample
y1=downsample(y1,Fs/fs);

%plot
t=1:size(y1,1);
plot(t,y1,t,gt);

But when comparing to the ground truth signal, it's far from correct.
Any suggestions?

Best Answer

I suspect that the problem lies in the FIR filter kernel you generate. (-10:10) generates a vector of 21 successive integers [-10, -9, -8 ... 8, 9, 10]. You then perform an elementwise multiplication of said vector by 10, resulting in the vector [-100, -90, -80 ... 80, 90, 100]. Finally you compute the sinc of each element, resulting in the vector [-0.0051, 0.0100, -0.0124 ... -0.0124, 0.0100, -0.0051]. Note that each sample is 10 rad (573 degrees) apart due to that multiplication by 10, which means that your filter is actually designed for a frequency a few times greater than the nyquist frequency at your sample rate. Probably not what you intended, and such a filter won't work at all.