@svanya Wow. Looks nice.
The values I had used for the various bands were chosen to approximate a flat frequency response. So, you adjusted one value, and the noise was suppresed (more or less) evenly accross all bands.
You've made it so that you can suppress the noise by band - sort of a graphic noise equalizer.
The value you've labeled hip_frq is what differentiates static noise from actual content. The lower this value, the longer a sound must be present for it to be removed as noise. Say, you sing a really long note that goes on for 10 seconds. If the hip_frq is set to 1Hz, then that note will be recognized as noise after a second or so and will be filtered out. So, you would set the hip_frq to a lower value (say, 0.1Hz) which will make the filter allow the long note. It also means that the filter will respond slowly to all noise. With hip_frq set to 0.1Hz, it will take around 10 seconds before a sound with a constant volume is filtered out.
The lop_frq is sort of the opposite. Anything whose volume changes to quickly is assumed to be noise. If lop_frq is set too low, then you will lose things like snaps or pops (say, the click of beating drumsticks together or the onset of a cymbal crash.)
The values for hip_frq and lop_frq I used were what I found useful for speech.
hip_frq probably needs to be lower for music, and lop_frq probably needs to be higher for music.
@svanya Use the MultibandNoiseFilter. The left inlet is audio, the right sets how much noise to remove. The outlet is the filtered audio,
Attach a slider to the right inlet with a range from 0 to 2. That ought to be a wide enough range that you can adjust it to clean things up without also destroying the voice signal.
How it works is pretty simple, but difficult for me to put into words. If you are interested in how it works, take a look inside NoiseFilter and NoiseDetector.
NoiseFilter pretty much just attenuates the audio based on the noise level that it finds. How it finds the noise level is the trick.
It uses the subpatch dBr to find the level of the signal, then passes that through a highpass filter and a low pass filter. Those two determine what is seen as "static" noise. Anything that changes slower than the high pass is static noise. Anything that changes slower than the lowpass is signal. Anything that changes faster than the lowpass is noise.
Changing the value of the highpass determines how fast things get filtered out - if it "eats" your long notes, then you need to make the cutoff of the high pass lower.
Once it has the filtered level, it takes the absolute value of the variations in the level and compares them to the selected noise reduction level. Anything below the desired level closes the gate. Since this causes a pulsing signal, theres's a lowpass to smooth it out.
Now, you have a signal proportional to how much noise is in your signal. The more the noise, the lower this proportional signal is.
Multiply that with your original audio, and it attenuates the audio according to how much noise there is.
The rest is splitting it into bands so that you don't attenuate everything at once, but just the frequencies where there's noise.
If you don't get carried away with it, the side effects stay pretty much out of the way.
It isn't level dependent. If you set it up so that you get say 3dB of noise reduction, then it will remove 3dB of noise and doesn't care if the noise is at -10dB or at -50dB. It removes 3dB in any case, so down to -13 or -53 in the examples.
There is a time factor that may need to be modified way down inside - this thing was originally intended for voice (speech) rather than music. If you find it muting your (long, lingering) notes then it can be easily modified.
Another effect it has is that even at the lowest setting, it will kill feedback squeal dead.
OK. Found it. If you go through the PD help browser, then under 5.reference you can find all_about_arrays.pd
There is then a patch named How_to_manipulate_arrays_in_PD in that patch is another named Additional_tools which finally shows how to set ticks and labels.
While I was digging, I found another patch that shows how to get selected values - which I also need.
There seems to be a way to change the size of the array, too.
I'll see if I can mix it all together and get what I need.
I've looked at the help files and been all over google, but I can't find a way to add grid lines and scales to an array.
How could I do something like in the attached picture using PD - keeping in mind that I need to change the grid markings and intervals depending on the data to be displayed and that I would really like to be able to change the size of the array display while the program is running.
Is there anything built in to PD, or is there and external, or will I have to bodge something together to get the effects I want?
Well, the forum crash seems to have eaten my last post.
I have made a noise filter to clean up audio signals live.
Other noise removal filters need to have a noise sample selected and try to remove that noise from the complete track - they only work offline.
This patch works online. It removes any stationary noise from the signal and doesn't need any user adjustment except that it does need to be told how much to reduce the noise.
"Stationary noise" is a signal whose frequency content and amplitude stay (more or less) constant for over 1 second. Fan hum is a good example, as well as the more or less "white" noise from the wind from the fan. Car motor sounds from a car travelling at constant speed is also a good example.
It will also kill feedback squeal cold, even at the lowest settings.
The patch is built in layers, and the lower layers can be used independently or combined and used to build different filters.
The attached zip file includes all the components from the lowest level up to a complete demonstation that takes in audio from a microphone and puts out filtered audio on line out. It also includes a set of help files that describe the function and use of the various modules.
NoiseLevelDetector.pd - estimates the amplitude of the stationary noise
NoiseFilter.pd - attenuates the signal based on the amplitude from
NoiseLevelDetector.pd Since it is more effective at high frequencies, it is best to feed it limited bandwidth signals and use multiple filters to cover the desired audio range.
BandLimitedNoiseFilter.pd - a Noisefilter that only works on the specified frequency range.
MultibandNoiseFilter.pd - a complete filter that covers the range from 40Hz upto 22000 hz to filter the complete audio spectrum.
Test.pd - demo program that demonstrates the use of MultibandNoiseFilter.pd
It works best for speaking voices. Singing tends to be more stationary. It could be adapted to singing voices by changing a single value in one of the lower level blocks.
The original idea was to create filter for removing car noises from microphone audio for two-way radios. When used to cover just the range from 300Hz to 3000Hz, it does a very good job.
The biggest disadvantage is that it will start making "musical noise" if there is a lot of noise and the attenuation is set high. It also adds a slight echoing quality to the filtered audio.
The project is hosted on GitHub: PureData NoiseFilter project.
Use a value that ranges between 0 and 1 for the wet portion. Subtract that from 1 for the dry portion. Multiply the wet signal by the number for the wet portion, multiply the dry signal by the dry portion.
When you set the wet portion to zero, then the dry portion will be 1. When the wet portion is 1 then the dry portion is 0.
Have a look at the attached file to see what I mean.