8

周囲の音量を測定したいのですが、正しいことをしているかどうかはわかりません。

0 (静か) から 120 (非常にうるさい) の範囲の VU メーターを作成したいと考えています。

Peak と Avg パワーを取得しましたが、通常の静かな環境では非常に高いです。私にいくつかのポインタを教えてください。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    //creating an audio CAF file in the temporary directory, this isn’t ideal but it’s the only way to get this class functioning (the temporary directory is erased once the app quits). Here we also specifying a sample rate of 44.1kHz (which is capable of representing 22 kHz of sound frequencies according to the Nyquist theorem), and 1 channel (we do not need stereo to measure noise).

    NSDictionary* recorderSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
                                      [NSNumber numberWithInt:44100],AVSampleRateKey,
                                      [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                                      [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                                      [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                                      [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                      nil];
    NSError* error;

    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
    recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&error];

    //enable measuring
    //tell the recorder to start recording:
    [recorder record];

    if (recorder) {
        [recorder prepareToRecord];
        recorder.meteringEnabled = YES;
        [recorder record];
        levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];

    } else
    {
        NSLog(@"%@",[error description]);
    }        
}

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

    const double ALPHA = 0.05;
    double peakPowerForChannel = pow(10, (0.05 * [recorder averagePowerForChannel:0]));
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;     

    NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults);

    float tavgPow =[recorder averagePowerForChannel:0] + 120.0;
    float tpPow = [recorder peakPowerForChannel:0] + 120.0;

    float avgPow = tavgPow;//(float)abs([recorder averagePowerForChannel:0]);
    float pPow = tpPow;//(float)abs([recorder peakPowerForChannel:0]);

    NSString *tempAvg = [NSString stringWithFormat:@"%0.2f",avgPow];
        NSString *temppeak = [NSString stringWithFormat:@"%0.2f",pPow];
    [avg setText:tempAvg];
        [peak setText:temppeak];
    NSLog(@"Average input: %f Peak input: %f Low pass results: %f", avgPow,pPow , lowPassResults);
}   
4

5 に答える 5

8

基準として 1.0 を使用する場合 (0db の場合) に線形振幅をデシベルに変換する式は、次のとおりです。

20 * log10(amp);

だから私はあなたのコードを見て意図について確信が持てませんが、おそらくあなたは望んでいます

float db = 20 * log10([recorder averagePowerForChannel:0]);

これは、ゼロの振幅で -infinity から 1 の振幅で 0db になります。本当に 0 から 120 まで上げる必要がある場合は、120 を追加し、ゼロで max 関数を使用できます。

したがって、上記の行の後に:

db += 120;
db = db < 0 ? 0 : db;

あなたが使用している数式は、DB を amp に変換するための数式のように見えますが、これはあなたが望むものとは逆だと思います。

編集:読み直しましたが、すでにデシベル値を持っているようです。

この場合は、振幅に変換せずに 120 を加算してください。

変更する

double peakPowerForChannel = pow(10, (0.05 * [recorder averagePowerForChannel:0]));

double peakPowerForChannel = [recorder averagePowerForChannel:0];

そして、あなたは大丈夫なはずです。

于 2012-02-12T07:57:48.420 に答える
1

実際には、デシベルの範囲は -160 ~ 0 ですが、正の値になることもあります。( AVAudioRecorder クラス リファレンス- averagePowerForChannel: メソッド)

db += 160;それならの代わりに書いたほうがいいですdb += 120;。もちろんオフセットを入れて補正することもできます。

于 2013-03-20T12:45:44.813 に答える
0

NSRecorderから生成されたwavデータとからのデシベルデータの間のマッピング関係を変換する回帰モデルを作成しますNSRecorder.averagePowerForChannel

NSRecorder.averagePowerForChannel(dB) = -80+6 log2( wav_RMS)

wav_RMSwav データの 0.1 秒という短い時間の二乗平均平方根の値はどこにありますか。

于 2017-08-09T02:32:45.463 に答える