2017-12-03 4 views
3

私は時間の経過とともに振幅を取得し、グラフを作成するためにサウンドファイル(.m4a)を分析しようとしています。私は、素晴らしい(下記)コードをオンラインで見つけました。しかし、私はさらに、目標とする周波数範囲にないすべての音をフィルタリングしたいと思います。例えば。私は、1900〜2100 Hzの間の音だけをグラフにしたい。これどうやってするの?.m4aデータからの周波数のフィルタリング

var processingBuffer = [Float](repeating: 0.0, count: Int(readFile.arrayFloatValues.count)) 
    let sampleCount = vDSP_Length(readFile.arrayFloatValues.count) 

    vDSP_vabs(readFile.arrayFloatValues, 1, &processingBuffer, 1, sampleCount); 

    let samplesPerPixel = 1 
    let filter = [Float](repeating: 1.0/Float(samplesPerPixel), count: Int(samplesPerPixel)) 
    let downSampledLength = Int(readFile.arrayFloatValues.count/samplesPerPixel) 
    var downSampledData = [Float](repeating:0.0, count:downSampledLength) 

    vDSP_desamp(processingBuffer, 
       vDSP_Stride(samplesPerPixel), 
       filter, &downSampledData, 
       vDSP_Length(downSampledLength), 
       vDSP_Length(samplesPerPixel)) 

    readFile.points = downSampledData.map{CGFloat($0)} 

編集

記録は、実際には早い時点で、デバイスのマイクから記録されています。記録段階でフィルタを適用する方が簡単でしょうか?

+0

周波数ドメインに入った振幅/時間データを変換して編集し、時間ドメインに戻します。 FFTが動作します。 – meggar

+0

これを行う方法に関するヒントは?私はAccelerateフレームワークを使用しているようですが、おそらくこれが役立ちます:https://developer.apple.com/library/content/documentation/Performance/Conceptual/vDSP_Programming_Guide/Introduction/Introduction –

+0

私は本当に処理のサウンドに新しいです。 .html – meggar

答えて

2

可能な方法は、サンプリングされたファイルに離散フーリエ変換を適用することです。フーリエ変換は、オーディオデータを時間領域から周波数領域に転送する。そのデータを周波数領域で取得したら、不要な周波数を「カットアウト」し、縮小したデータで逆フーリエ変換を行うことができます。そのため、再び時間領域に入り、あなたが言及したコード。 https://github.com/christopherhelf/Swift-FFT-Exampleを見ると、迅速かつ高速フーリエ変換(FFT)に対処する方法のコード例が示されています。 これはあなたに方向性を与えることを願っています。

+0

これは実際にはひどいアプローチです。i)FIRフィルタまたはIIRフィルタは、時間領域ではFFTよりもはるかに安価で、IFFTではii)それはひどく聞こえます(https://en.wikipedia.org/wiki/を参照)。ギブスフェノメノン)、そしてiii)パスバンドが望みよりもはるかに広いので(メモリが使えば6dB /オクターブ)、本当にうっすらなフィルターになります。 iv)BTW - すべての損失の多いコーデックは、周波数領域で動作し始めます。なぜ、ベースバンドに変換して再びFFTを計算しますか? これは、IIRバンドパスフィルタです。 – marko

関連する問題