Vital-Signs-Detection-and-Estimation / signalReconstruction_.m
signalReconstruction_.m
Raw
function [recSig, peakFreqs, peakLocs]=signalReconstruction_(signal,param,iteration)

    if ~exist('iteration','var')
     % third parameter does not exist, so default it to something
        iter = 2;
    else
        iter = iteration;
    end
    
    signal = signal';
    N = param.samplerange;
    K = N; %round(2/3 * N);
    n = 0:N-1;
    t = linspace(param.startsec,param.endsec,N);
    Fs = param.Fs;
    f = (0:N-1)*Fs/N;
   
    %Representation basis
    Psi = dftmtx(N);
    Psi_inv = conj(Psi)/N;
    signal_fft = Psi*signal;

    % Obtain K measurements
    sig_m = zeros(N,1);
    q = randperm(N);
    q = q(1:K);
    sig_m(q) = signal(q);
   
    % sensing matrix
    A = Psi_inv(q,:);
    y = A*signal_fft;           %measured values

    [FFT_recSig] = OMP_(A,y,iter);
    
    recSig = real(Psi_inv*FFT_recSig); %IFFT of FFT_recSig

    signal_fft = signal_fft(1:N/2+1);
    FFT_recSig = FFT_recSig(1:N/2+1);
    f = f(1:N/2+1);

    [peakFreqs, peakLocs] = findpeaks(abs(FFT_recSig),f);

    figure;
    subplot(4,1,1)
    plot(t,signal)
    title("Original Signal")
    xlabel("time(s)")

    subplot(4,1,2)
    plot(f,abs(signal_fft))
    title("Original Signal FFT")
   % xlim([0 param.Fs/2])
    xlabel("Frequency(Hz)")
    
    subplot(4,1,3)
    plot(f,abs(FFT_recSig))
    title("Reconstructed Signal FFT")
   % xlim([0 Fs/2])
    xlabel("Frequency(Hz)")
    
    subplot(4,1,4)
    plot(t,recSig)
    title("Reconstructed Time Signal")
    xlabel("time(s)")

    figure
    title("Signal Reconstruction CS-OMP")
    subplot(2,1,1)
    plot(t,signal,"b")
    hold on
    plot(t,recSig,'r',LineWidth=1)
    legend("Original Signal","CS-OMP Reconstructed Signal")
    xlabel("time(s)")
    hold off
    subplot(2,1,2)
    plot(f,abs(signal_fft),'b')
    hold on
    plot(f,abs(FFT_recSig),'r',LineWidth=1)
    legend("Original Signal FFT","CS-OMP Reconstructed Signal FFT")
    xlabel("Frequency(Hz)")
    
    
end