How can I do audio noise reduction programmatically?
Asked Answered
E

2

6

I'm developing an iPhone 4 (iOS 4) application that show an level meter.

This app measures human voice. But it has a problem. When there is a lot of noise, it doesn't work. It measures also background noise.

To measure sound, I use this:

- (void) initWithPattern:(Pattern *)pattern
{    
    mode = figureMode;
    [self showFigureMeter];

    patternView.pattern = pattern;

    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                              [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                              [NSNumber numberWithInt: 2],                         AVNumberOfChannelsKey,
                              [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                              nil];

    NSError *error;

    if (recorder == nil)
        recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

    if (recorder) {
        [recorder prepareToRecord];
        recorder.meteringEnabled = YES;
        [recorder record];

        levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 
                                                      target: self
                                                    selector: @selector(levelTimerCallback:)
                                                    userInfo: nil 
                                                     repeats: YES];
    }
}

- (void)levelTimerCallback:(NSTimer *)timer
{
    [recorder updateMeters];

    float peakPower = [recorder peakPowerForChannel:0];

    if (mode == figureMode)
    {
        if (peakPower < -40) {
            ;
        } else if ((peakPower > -40) && (peakPower < -30)) {
            ;
        } else if ((peakPower > -30)  && (peakPower < -20)) {
            ;
        } else if ((peakPower > -20) && (peakPower < -10)) {
            ;
        } else if (peakPower > -10) {
            ;
        }
    }
}

Is there any way to remove background noise?

Erb answered 23/11, 2011 at 18:48 Comment(0)
S
1

Noise reduction usually involves sampling the sound (as raw PCM samples), and doing some non-trivial digital signal processing (DSP). One needs a well defined characterization of the noise and how it is different from the desired signal (frequency bands, time, external gating function, etc.) for this to be tractable at all.

You can't just use AVAudioRecorder metering.

Straus answered 25/11, 2011 at 0:39 Comment(1)
HI, Do you have any sample for that?Hunfredo
L
0

You can measure the noise level when no one's speaking (either ask for silence or simply select the lowest measured level) then subtract from the instantaneous level.

Or you can use an FFT to attempt to filter out the background noise by selecting only "voice" frequencies (no success guaranteed).

Last answered 23/11, 2011 at 19:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.