0
votes

I'm hoping someone will be able to tell me why no filtering is helping in my application.

I have a MEMS microphone monitoring the pressure of a small chamber, which has a membrane stretched over the far end. This device is placed on a human muscle and when I flex said muscle the membrane is disturbed, producing a pressure difference in the chamber, which the microphone picks up. Therefore, by flexing a muscle I can see nice spikes of activity. However, this method is very susceptible to noise, both motion artefacts and other undesirable artefacts.

The muscle activity I'm interested in is above 10Hz and below 100Hz, so I'm trying to bandpass (or at the very least, highpass) the noise. If I tap the device, or if I have the device on my upper forearm and tap my wrist, I'm to understand that this is a very low frequency noise, somewhere in the region of 1Hz/2Hz, but I can't get rid of this noise!

I'm using MATLAB to process. Generally I sample this microphone at 1KHz, but I currently have it hooked up to a DAQ at 5KHz sampling rate. I desperately want to get rid of this low frequency noise but nothing I try seems to make any difference, it's very hard to see what the filter is doing at all. It's definitely attenuating the signal, but not getting rid of the noise I want. I don't expect perfect results, but certainly better than what I'm seeing.

I've used lots of methods to create filters in MATLAB (manually and fdatool), along with different types of filters (Butterworth, Chebyshev, Elliptic) all not helping. I'm worried that my desired frequency of 10Hz is perhaps too close to the noise I'm trying to filter out, and it's not able to attenuate the noise enough.

Any ideas, code samples, or recommendations would be very helpful.

1
Include the exact code you have tried, and some figures if possible, so that we can help better. In principle, a low pass filter should be what you need. Which cutoff frequency did you use?Luis Mendo
Surely you mean high pass? I can't post the code I've used with fdatool as it auto-generates the filter based on the parameters I give, but the manual method I have tried is here: filtCutOffHigh = 10; [b, a] = butter(1, (2*filtCutOffHigh)/(1/(1/fs)), 'high'); filteredData = filtfilt(b, a, originalData); filtCutOffLow = 100; [b, a] = butter(1, (2*filtCutOffLow)/(1/(1/fs)), 'low'); filteredData = filtfilt(b, a, originalData);ritchie888
Yes, sorry, high-passLuis Mendo
Well it seems to work for me. I used 10 seconds of a 1-Hz plus a 20-Hz sinusoid: fs = 5000; t = 1:1/fs:10; originalData = sin(1*2*pit) + sin(20*2*pit); and your Butterworth high-pass filter more or less gets rid of the 1-Hz signalLuis Mendo
1. How strong is the noise compared to the signal? Filters aren't magical. It won't work if, for example, originalData = 1000*sin(1*2*pit) + sin(20*2*pit);dmm

1 Answers

1
votes

Tapping or percussive sounds are broad spectrum, producing frequency content well above the repeat rate of 1 Hz or so. So any linear band pass or high pass filter will not be able to completely remove this broad spectrum noise.