Как я могу сделать шумоподавление программно? - PullRequest
6 голосов
/ 23 ноября 2011

Я разрабатываю приложение для iPhone 4 (iOS 4), в котором отображается индикатор уровня.

Это приложение измеряет человеческий голос. Но у него есть проблема. Когда много шума, это не работает. Он также измеряет фоновый шум.

Для измерения звука я использую это:

- (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) {
            ;
        }
    }
}

Есть ли способ убрать фоновый шум?

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Подавление шума обычно включает выборку звука (как необработанные выборки PCM) и выполнение некоторой нетривиальной цифровой обработки сигналов (DSP).Требуется четко определенная характеристика шума и того, как он отличается от желаемого сигнала (полосы частот, время, функция внешнего стробирования и т. Д.), Чтобы его можно было вообще отслеживать.

Вы не можете простоиспользовать измерение AVAudioRecorder.

0 голосов
/ 23 ноября 2011

Вы можете измерить уровень шума, когда никто не говорит (либо попросить тишины, либо просто выбрать самый низкий измеренный уровень), а затем вычесть из мгновенного уровня.

Или вы можете использовать БПФ, чтобы попытаться отфильтровать фоновый шум, выбрав только «голосовые» частоты (успех не гарантирован).

...