Using a specific wavelet transform on new ECG signals

11 Ansichten (letzte 30 Tage)
Thomas Fogarty III
Thomas Fogarty III am 7 Mär. 2017
Beantwortet: ziani am 30 Jun. 2024
I'm working with ECG signals and am trying to use a wavelet technique to reduce some of the noise in various data sets. I was able to use a 'Continuous Wavelet 1-D using FFT' technique in the Wavelet Analyzer toolkit to achieve a good response (at least on one sample). I have exported the CWTFT struct to a variable called CWTS and want to apply the same wavelet function on a number of other pieces of data.
My overall goal would be to have a command or function that applies the same wavelet transform I generated to new input data.
I am somewhat of a novice in the wavelet / signal processing realm, so if there are smarter or better ways to approach this, please let me know. I tried several random wavelets and this option seemed to do the best for me.
How I generated the wavelet transformed data: 1-D/FFT -> 'dog', 6 parameter, linear analysis, linear synthesis, scale limited to first 16 options
Here are some of the details: CWTS Contents: CWTS.cfs, CWTS.scales, CWTS.frequencies, CWTS.omega, CWTS.meanSIG, CWTS.dt, CWTS.wav
Here are the pre / post transform plots of the data:
Pre-Transform/Raw Data
Post-Transform
Thanks for any help you guys can offer!
  2 Kommentare
farzana iqbal
farzana iqbal am 16 Mär. 2018
Hi, I am also working on a similar project. Would you mind sharing your model here or of you can email at farzana.iqbal3@gmail.com
Helen Nonyelu
Helen Nonyelu am 14 Jul. 2021
Hi can anyone suggest on how to denoise ecg signal using waveletneural network and also the code if possible

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Prateek Khandelwal
Prateek Khandelwal am 14 Mär. 2017
Hi !
Wavelet Analyzer app is merely a front-end for easy accessibility to various algorithms under wavelet toolbox.
I would suggest you go through the documentation page on Generation of MATLAB code for 1-D decimated Wavelet Denoisising & Compression for basic steps that might be useful for your goal .
  1 Kommentar
Thomas Fogarty III
Thomas Fogarty III am 20 Mär. 2017
thanks - that seems to be what I was looking for! I'll give it a shot and see if I can make it work!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

ziani
ziani am 30 Jun. 2024
Here is the complete error-free code for Wavelet Analysis of Physiologic Signals.
load mit200
figure
plot(tm,ecgsig)
hold on
plot(tm(ann),ecgsig(ann),'ro')
xlabel('Seconds')
ylabel('Amplitude')
title('Subject - MIT-BIH 200')
qrsEx = ecgsig(4560:4810);
fb = dwtfilterbank('Wavelet','sym4','SignalLength',numel(qrsEx),'Level',3);
psi = wavelets(fb);
figure
plot(qrsEx)
hold on
plot(-2*circshift(psi(3,:),[0 -38]),'r')
axis tight
legend('QRS Complex','Sym4 Wavelet')
title('Comparison of Sym4 Wavelet and QRS Complex')
hold off
wt = modwt(ecgsig,5);
wtrec = zeros(size(wt));
wtrec(4:5,:) = wt(4:5,:);
y = imodwt(wtrec,'sym4');
y = abs(y).^2;
[qrspeaks,locs] = findpeaks(y,tm,'MinPeakHeight',0.35,...
'MinPeakDistance',0.150);
figure
plot(tm,y)
hold on
plot(locs,qrspeaks,'ro')
xlabel('Seconds')
title('R Peaks Localized by Wavelet Transform with Automatic Annotations')
plot(tm(ann),y(ann),'k*')
title('R peaks Localized by Wavelet Transform with Expert Annotations')
figure
plot(tm,ecgsig,'k--')
hold on
plot(tm,y,'r','linewidth',1.5)
plot(tm,abs(ecgsig).^2,'b')
plot(tm(ann),ecgsig(ann),'ro','markerfacecolor',[1 0 0])
set(gca,'xlim',[10.2 12])
legend('Raw Data','Wavelet Reconstruction','Raw Data Squared', ...
'Location','SouthEast')
xlabel('Seconds')
[qrspeaks,locs] = findpeaks(ecgsig.^2,tm,'MinPeakHeight',0.35,...
'MinPeakDistance',0.150);
% Load the ECG signal data
load('mit203.mat')
figure
plot(tm,ecgsig)
hold on
plot(tm(ann),ecgsig(ann),'ro')
xlabel('Seconds')
ylabel('Amplitude')
title('Subject - MIT-BIH 203 with Expert Annotations')
wt = modwt(ecgsig,5);
wtrec = zeros(size(wt));
wtrec(4:5,:) = wt(4:5,:);
y = imodwt(wtrec,'sym4');
y = abs(y).^2;
[qrspeaks,locs] = findpeaks(y,tm,'MinPeakHeight',0.1,...
'MinPeakDistance',0.150);
figure
plot(tm,y)
title('R-Waves Localized by Wavelet Transform')
hold on
hwav = plot(locs,qrspeaks,'ro');
hexp = plot(tm(ann),y(ann),'k*');
xlabel('Seconds')
legend([hwav hexp],'Automatic','Expert','Location','NorthEast')
ecgmra = modwtmra(wt);
figure
plot(tm,ecgmra(5,:).^2,'b')
hold on
plot(tm,ecgmra(4,:).^2+0.6,'b')
set(gca,'xlim',[14.3 25.5])
timemarks = repelem(tm(ann),2);
N = numel(timemarks);
markerlines = reshape(repmat([0;1],1,N/2),N,1);
h = stem(timemarks,markerlines,'k--');
h.Marker = 'none';
set(gca,'ytick',[0.1 0.6]);
set(gca,'yticklabels',{'D5','D4'})
xlabel('Seconds')
title('Magnitude-Squared Level 4 and 5 Details')
load NIRSData
figure
plot(tm,[NIRSData(:,1) NIRSData(:,2)])
legend('Subject 1','Subject 2','Location','NorthWest')
xlabel('Seconds')
title('NIRS Data')
grid on
cwt(NIRSData(:,1),10,'bump')
figure
cwt(NIRSData(:,2),10,'bump')
[wcoh,~,F] = wcoherence(NIRSData(:,1),NIRSData(:,2),10);
figure
surf(tm,F,abs(wcoh).^2); view(0,90)
shading interp
axis tight
hc = colorbar;
hc.Label.String = 'Coherence';
title('Wavelet Coherence')
xlabel('Seconds')
ylabel('Hz')
ylim([0 2.5])
set(gca,'ytick',[0.15 1.2 2])
taskbd = [245 1702 2065 3474];
tvec = repelem(tm(taskbd),2);
yvec = [0 max(F)]';
yvec = reshape(repmat(yvec,1,4),8,1);
hold on
stemPlot = stem(tvec,yvec,'w--','linewidth',2);
stemPlot.Marker = 'none';
load dpoae
figure
plot(t.*1000,dpoaets)
xlabel('Milliseconds')
ylabel('Amplitude')
[dpoaeCWT,f] = cwt(dpoaets,2e4,'VoicesPerOctave',16);
helperCWTTimeFreqPlot(dpoaeCWT,t.*1000,f,...
'surf','CWT of OAE','milliseconds','Hz')
[~,idx1230] = min(abs(f-1230));
cfsOAE = dpoaeCWT(idx1230,:);
plot(t.*1000,abs(cfsOAE))
hold on
AX = gca;
plot([25 25],[AX.YLim(1) AX.YLim(2)],'r')
plot([175 175],[AX.YLim(1) AX.YLim(2)],'r')
xlabel('msec')
title('CWT Coefficient Magnitudes')
frange = [1150 1350];
xrec = icwt(dpoaeCWT,[],f,frange);
figure
plot(t.*1000,dpoaets)
hold on
plot(t.*1000,xrec,'r')
AX = gca;
ylimits = AX.YLim;
plot([25 25],ylimits,'k')
plot([175 175],ylimits,'k')
grid on
xlabel('Milliseconds')
ylabel('Amplitude')
title('Frequency-Localized Reconstruction of Emission')
xdft = fft(xrec);
freq = 0:2e4/numel(xrec):1e4;
xdft = xdft(1:numel(xrec)/2+1);
figure
plot(freq,abs(xdft))
xlabel('Hz')
ylabel('Magnitude')
title('Fourier Transform of CWT-Based Signal Approximation')
[~,maxidx] = max(abs(xdft));
fprintf('The frequency is %4.2f Hz\n',freq(maxidx))

Kategorien

Mehr zu Continuous Wavelet Transforms finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by