MATLAB Clean Wave File Impulse Noise with Matlab

AI Thread Summary
The discussion revolves around optimizing the process of cleaning impulse noise from a two-channel wave file in MATLAB. The original code iterates through each point in the signal, removing points that exceed specified trigger levels, but this approach is inefficient and slow. A user suggests vectorizing the code to enhance performance, recommending the use of logical indexing to create a new array that retains only the desired points. This method significantly speeds up the process. Additionally, another user inquires about modifying the code to set values exceeding the limits to zero instead of removing them, which is also achieved through vectorized operations. Overall, the conversation highlights the importance of vectorization in MATLAB for improving computational efficiency when processing large datasets.
JohnSimpson
Messages
89
Reaction score
0
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!
 
Physics news on Phys.org
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.
 
thank you! SOOO much faster now.
 
marcusl, i sent you a msg, get back to me when you can, thanks ^_^
 
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
 
This will do it:

sig(abs(sig(:,1)) > level1 | abs(sig(:,2)) > level2,:) = 0;
 
thanks a lot, i think I'm starting to catch on.
 

Similar threads

Replies
4
Views
1K
Replies
10
Views
3K
Replies
1
Views
2K
Replies
2
Views
2K
Replies
9
Views
5K
Back
Top