필터 지우기
필터 지우기

Using a specific wavelet transform on new ECG signals

조회 수: 10 (최근 30일)
Thomas Fogarty III
Thomas Fogarty III 2017년 3월 7일
답변: ziani 2024년 6월 30일 18:56
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
farzana iqbal
farzana iqbal 2018년 3월 16일
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 2021년 7월 14일
Hi can anyone suggest on how to denoise ecg signal using waveletneural network and also the code if possible

댓글을 달려면 로그인하십시오.

채택된 답변

Prateek Khandelwal
Prateek Khandelwal 2017년 3월 14일
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
Thomas Fogarty III
Thomas Fogarty III 2017년 3월 20일
thanks - that seems to be what I was looking for! I'll give it a shot and see if I can make it work!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

ziani
ziani 2024년 6월 30일 18:56
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))

카테고리

Help CenterFile Exchange에서 Time-Frequency Analysis에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by