PDA

View Full Version : matlab noise cleaning


JohnSimpson
May16-08, 09:33 AM
I'm attempting to clean impulse noise from a wave file in matlab. the file is two channels, about 7 million points in each channel. What I wish to do is keep points, that are below my trigger levels, and delete points (in both channels simultaneously) that are above the trigger levels for either channel. Code is below

for x = 1:1:lnth
if abs(sig(i,1)) > level1 || abs(sig(i,2)) > level2
sig(i,:) = [];
else
i=i+1;
end
end

The code works and does what I want it to. The problem is that its very, very slow. Is there a way I can vectorize the code to make it faster? Or does anyone have any suggestions for a smarter algorithim (I've had some ideas, but havn't bothered to code any of them)

Thanks!

marcusl
May16-08, 10:15 AM
Try masking the indices instead. If you wanted to copy the massaged results into a new array, for instance, do this:

newsig = sig(abs(sig(:,1)) <= level1 & abs(sig(:,2)) <= level2,:)

Should be faster than your for loop.

JohnSimpson
May16-08, 11:26 AM
thank you! SOOO much faster now.

JohnSimpson
May16-08, 01:29 PM
marcusl, i sent you a msg, get back to me when you can, thanks ^_^

JohnSimpson
May16-08, 01:32 PM
I'll post it here if someone else could help instead

How would I write vectorized code to have the signal value in both channels be set to zero if it exceeds the limits like before, instead of "removing" the values that were above the trigger values

marcusl
May19-08, 09:48 AM
This will do it:

sig(abs(sig(:,1)) > level1 | abs(sig(:,2)) > level2,:) = 0;

JohnSimpson
May20-08, 01:37 PM
thanks a lot, i think i'm starting to catch on.