Azzera filtri
Azzera filtri

Substituting noise with zeros

2 visualizzazioni (ultimi 30 giorni)
atek
atek il 15 Mar 2016
Commentato: atek il 22 Mar 2016
I have a segment of data that has a significant amount of noise. I know the start and end point of the noise when it is graphed and I want to substitute these aberrant values with zeroes OR split the segment into two areas, deleting the noise in the middle.
  13 Commenti
Star Strider
Star Strider il 15 Mar 2016
You have three columns in your .mat file.
  1. What are they?
  2. What am I looking at?
  3. How best to plot them?
  4. What’s your sampling frequency?
atek
atek il 15 Mar 2016
Thank you for spoon-feeding me these questions Strider
1. The three columns represent three EEG electrodes that are in very close proximity to one another
2. They are in units of milli volts
3. Power spectrum
4. 1024

Accedi per commentare.

Risposta accettata

Star Strider
Star Strider il 15 Mar 2016
The good news is that I got a filter that filtered your signal up to the spike, because that’s the easiest way to deal with the discontinuities.
The bad news is that there’s nothing in your data. I cannot identify any EKG patterns such as QRS complexes in your (extremely noisy) data. Yours is one of those ‘I wish we could have discussed this earlier’ situations. I’ve gone into detail about the vectorcardiogram loop and its projections on the various EKG leads in many earlier posts. You didn’t describe your experimental set-up or design, so I don’t know if you used a ‘ground’ (actually common reference) electrode to subtract-out the noise in your differential amplifier set-up. The problem with putting the EKG leads too close together is that there is nothing for the vectorcardiogram loop to project onto. I’m not even sure where you put them.
I used a low-pass version of my usual band-pass filter design for EKGs on your signal, and could recover nothing in the filtered signal that I could identify as anything resembling a normal EKG. In figure(5), I even tried to see if I could recover information from a spatial representation of the signal, but there really is nothing in your data. I gave it my best effort!
My code:
D = load('Andy Tek PleaseClean.mat');
s = D.PleaseClean;
Fs = 1024; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency
L = size(s,1);
t = linspace(0, 1, L)/Fs; % Sampling Time (s)
Smean = mean(s);
Sstd = std(s);
CE95 = bsxfun(@plus, Smean, bsxfun(@times,Sstd*1.96,[-1 1]'));
[maxs,idx] = max(s);
sLen = min(idx-10);
s = s(1:sLen,:);
t = t(1:sLen);
figure(1)
subplot(3,1,1)
plot(t, s(:,1))
axis([xlim 0.001*CE95(:,1)'])
grid
subplot(3,1,2)
plot(t, s(:,2))
axis([xlim 0.001*CE95(:,2)'])
grid
subplot(3,1,3)
plot(t, s(:,3))
axis([xlim CE95(:,3)'])
grid
Q1 = s(1:5,:); % Look
fts = fft(s)/sLen;
Fv = linspace(0, 1, fix(sLen/2)+1)*Fn;
Iv = 1:length(Fv);
figure(2)
subplot(3,1,1)
plot(Fv, abs(fts(Iv,1))*2)
axis([0 100 0 1E-1])
grid
subplot(3,1,2)
plot(Fv, abs(fts(Iv,2))*2)
axis([0 100 0 1E-1])
grid
subplot(3,1,3)
plot(Fv, abs(fts(Iv,3))*2)
axis([0 100 0 1E-4])
grid
Wp = 50/Fn;
Ws = 75/Fn;
Rp = 10;
Rs = 50;
[n,Wn] = buttord(Wp, Ws, Rp, Rs);
[b,a] = butter(n,Wn);
[sos,g] = tf2sos(b,a);
figure(3)
freqz(sos, 2048, Fs)
sf = filtfilt(sos,g,s);
Q2 = sf(1:5,:); % Look
figure(4)
subplot(3,1,1)
plot(t, sf(:,1))
axis([xlim 0.001*CE95(:,1)'])
grid
subplot(3,1,2)
plot(t, sf(:,2))
axis([xlim 0.001*CE95(:,2)'])
grid
subplot(3,1,3)
plot(t, sf(:,3))
axis([xlim CE95(:,3)'])
grid
figure(5)
plot3(sf(:,1), sf(:,2), sf(:,3))
grid on
  9 Commenti
Image Analyst
Image Analyst il 22 Mar 2016
windowWidth is the moving window size over which you want to take the mean inside. For example if you had a 1-D array and a window width of 5, the element #13 of the output would be the average of elements 11, 12,13,14, & 15 of the input because those are the 5 elements enclosed by the window when the window is centered at element 13.
atek
atek il 22 Mar 2016
So I want to have a 30 second window width and fs is 1024. My signal is 'PleaseClean' which has dimensions [825634,3]. I ran the following:
windowWidth = 1024*30 meanSignal = conv(PleaseClean, ones(1, windowWidth)/windowWidth, 'same');
But I received the following error Error using conv (line 28) A and B must be vectors.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 15 Mar 2016
Can you just do a salt and pepper noise cleaning? Just run the signal through a median filter, and where there are huge spikes, replace them with the median filtered version
badElements = abs(signal) > 5; % or whatever constitutes noise.
% Get rid of spikes. However, this alters the "good" elements also.
medianFilteredSignal = medfilt1(signal, 3);
% Replace only the bad elements, not the good ones.
signal(badElements) = medianFilteredSignal(badElements);

Tag

Non è stata ancora inserito alcun tag.

Community Treasure Hunt

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

Start Hunting!

Translated by