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?

VansFannel
  • 45,055
  • 107
  • 359
  • 626

2 Answers2

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.

hotpaw2
  • 70,107
  • 14
  • 90
  • 153
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).

Hot Licks
  • 47,103
  • 17
  • 93
  • 151