Vital-Signs-Detection-and-Estimation / mainTop_new.m
mainTop_new.m
Raw
clear; clc;

%%
param = parametersDeclaration();

%% Reading csv file

[Idata_all, Qdata_all] = dataFile(param);

%% Balancing IQ signals using S.W.Ellingson algorithm

[Idataall_bal, Qdataall_bal]=SWEllingson_(Idata_all,Qdata_all);

%reshaping the data for signal processing
counter = 0;
for i=1:param.datalength  %datalength

    for j=1:param.numSamplesperChirp % samples per chirp
        
        counter = counter+1;
        Idata_OP(i,j) = Idataall_bal(counter);
        Qdata_OP(i,j) = Qdataall_bal(counter);

    end

end

%% PLOTTING Balanced I AND Q SIGNALS

figure
t = (0:length(Idata_OP(1,:))-1)*param.numSamplesperChirp/length(Idata_OP(1,:));
plot(t,Idata_OP(1,:))
title("Balanced IQ signals")
hold on
t = (0:length(Qdata_OP(1,:))-1)*param.numSamplesperChirp/length(Qdata_OP(1,:));
plot(t,Qdata_OP(1,:))
xlabel("samples per chirp")
ylabel("amplitude")
legend('Idata','Qdata')
hold off

%% Balanced Constellation Diagram

figure
plot(Idataall_bal, Qdataall_bal, 'r*');
title('Balanced IQ constellation diagram');
xlabel('real part');
ylabel('imaginary part');

%% Range FFT

[rangeProfile, peakAmplitudes, maxFrequencies] = rangeFFT(Idata_OP,Qdata_OP,param);

%% object range frequecy for each chirp

[peakFreq] = maxFreq(peakAmplitudes, maxFrequencies);

%% Range for every chirp using the respective beat signal
[target_range] = Range_(peakFreq, rangeProfile, param);

%% Rangebin to be found

cmplx = complex(Idata_OP,Qdata_OP);
[rangebin, databin] = rangeBin_(target_range, rangeProfile, cmplx, param);

%% phase and phase-based range measurement
% 6000 chirps were trasmitted which means 6000/20 number of frames which is 
% the same number of seconds the radar was active. After doing the math, the radar 
% recorded for 300 seconds. Taking 1200 samples covers 60 seconds which is used 
% for measuring the phase and phase-based range measurement.

[phi, phase_range] = extendedDACMalgorithm_(rangebin, param);

%% Phase difference

phi_new = phaseDifference(phi,param);

phi_cut = phi_new(param.startsample:param.endsample);
phi_cut = ImpulseDenoise(phi_cut,param);


%% Filtering both HeartBeat and BreathingRate out

[filterBR, filterHR] = filterDesign_(param);

breathing_signal = filter(filterBR,phi_new);
heart_signal = filter(filterHR,phi_new);

figure
subplot(2,1,1)
plot(linspace(param.startsec,param.endsec,param.samplerange),breathing_signal(param.startsample:param.endsample))
title("Breathing Signal vs Time")
xlabel("time(sec)")
ylabel("Amplitude")
subplot(2,1,2)
plot(linspace(param.startsec,param.endsec,param.samplerange),heart_signal(param.startsample:param.endsample))
title("Heart Signal vs Time")
xlabel("time(sec)")
ylabel("Amplitude")


%% Autocorrelation estimation in time domain

[estimatedBRauto_filter, estimatedHRauto_filter] = autoEstimation(breathing_signal(param.startsample:param.endsample), heart_signal(param.startsample:param.endsample),param);


%% Compressing and Reconstructing the Breathing Signal Using CS-OMP algorithm

[reconstructed_breathingSignal, brPeakAmps, brPeakFreqs] = signalReconstruction_(breathing_signal(param.startsample:param.endsample),param);
[reconstructed_heartSignal, hrPeakAmps, hrPeakFreqs] = signalReconstruction_(heart_signal(param.startsample:param.endsample),param, 20);

[estimatedBRauto_CS, estimatedHRauto_CS] = autoEstimation(reconstructed_breathingSignal, reconstructed_heartSignal,param);
[estimatedBRfft_CS, estimatedHRfft_CS] = CalculateCS_VitalSigns(brPeakAmps,brPeakFreqs,hrPeakAmps,hrPeakFreqs);


%% Use waveletAnalyzer toolbox to decompose and reconstruct the signals just using sinusoidal wave for easy approximation 

Wavelet_reconstructionTool(breathing_signal,1,param);
Wavelet_reconstructionTool(heart_signal,10,param);


%% Wavelet Decomposition

[peakAmp, locFreq]=waveletTrial(phi_cut,param);
 
[estimatedBR_WT, estimatedHR_WT] = Calculate_VSWT(peakAmp,locFreq);