Using an NLMS filter for background tones/beeps
Hi,
We have an application where we have a beep/tone in our audio input that we would like to remove (using ADAU1452).
Currently we are a notch filter to do this with good results. Unfortunately we ran into 2 issues during field tests:
The actual frequency of our tone (600 Hz) varies a bit per location (+/- 15 Hz).
We have harmonics
We can widen the notch filters a bit to accommodate for the offset of the ‘base frequency’, but we would have to double that for every harmonic, effectively harming our audio response a lot > 4 kHz.
Looking at some of the theory and use cases described on this forum I would imagine that we could use the NMLS filter in this situation to get better results. However since we only have 1 signal I’m not sure how to do this. Does anybody have a suggestion for this, or would there be even better filter to accomplish this?
On a sidenote: Sometimes the tones are intermittent (beep-beep-beep), so we should gate the filter learning for that. But we can leave that aside for now.
Audio Signal Processors
adau1452
SigmaDSP Audio Processors
NMLS
SigmaDSP
Hello Harjo,
I am working on a solution. I do have a quick question. Can your application tolerate a delay of possibly a few hundred milliseconds?
Also, do you have an audio file to use as an example to try to filter?
Thanks,
Dave T
Hi Dave,
Thanks.
It depends on whether you mean delay in the actual audio, or delay in enabling the filtering. The second one isn't neccesarily a problem, the first one is.
I'll see If i can arrange a testfile for you.
Hello Harjo,
I mean a delay in the audio. Sometimes it is handy to add some delay to be able to allow for sensing of something ahead of the audio that you would hear. To do that you delay the audio so the processing can act on a real time event.
Dave T
Hi Dave. I understand. However in this case more delay is a bigger problem than a slow response. Since the noise/beep frequencies are not changing in real-time it would be fine if we slowly settle our filters.
I had to 'create' a testfile for you since we're not allowed to use actual recordings. The voice is artificial, be beep is a real recording.
Maybe some additional info that might help understand the first point: The application is a push-to-talk communication system. So our filtering needs to 'work' when somebody is pushing PTT to talk into the system. But we will continously process audio comming form the microphone so most of the times the filters would have settled way before somebody starts using the system.
Play this audio clip
Hello,
See attached project, it uses an NLMS filter with a delay to remove tones from a broadband signal. This is the method used by Adaptive Line Enhancers, it might do what you want.
In the case where signal is narrowband and noise is broadband, or signal is broadband and noise is narrowband, a delayed version of the input signal can be used as the reference input. This is because a broadband signal is not correlated to previous sample values unlike a narrowband signal. We only need to insure that the delay introduced should be greater than the decorrelation-time of the broadband signal and less than the decorrelation-time of the narrowband signal:
τd (BB) < delay < τd (NB)
EZoneToneRemove.dspproj
Thanks bitmechanic! I will give it a try in the real life system asap. I'll keep you posted!
Just wondering: Since we (approximatly) know the frequencies of our noise, could we improve this setup by filtering off the signal in our noise path (with some relatively wide notch filters as a pass-through for the tones)?
Please log in to reply.