필터 지우기
필터 지우기

Substituting noise with zeros

조회 수: 2 (최근 30일)
atek
atek 2016년 3월 15일
댓글: atek 2016년 3월 22일
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
Star Strider
Star Strider 2016년 3월 15일
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 2016년 3월 15일
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

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

채택된 답변

Star Strider
Star Strider 2016년 3월 15일
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
Image Analyst
Image Analyst 2016년 3월 22일
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 2016년 3월 22일
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.

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

추가 답변 (1개)

Image Analyst
Image Analyst 2016년 3월 15일
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);

카테고리

Help CenterFile Exchange에서 Parametric Spectral Estimation에 대해 자세히 알아보기

태그

아직 태그를 입력하지 않았습니다.

Community Treasure Hunt

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

Start Hunting!

Translated by