バイト配列として (vb に) 格納されたサンプルの周波数を見つける必要があります。サンプルは正弦波であり、既知の周波数であるため、確認できます)、しかし数値は少し奇妙で、私の maths-foo は弱いです。値の全範囲 0 ~ 255。数値の 99% は 235 から 245 の範囲にありますが、0 と 1 までの外れ値があり、残りの 1% には 255 までの外れ値があります。これを正規化して外れ値を取り除くにはどうすればよいですか (異なるサンプルで変化する可能性があるため、235-245 間隔を計算します)。次に、ゼロクロッシングを計算して周波数を取得するにはどうすればよいですか? この説明がゴミである場合は申し訳ありません!
7 に答える
FFT がおそらく最良の答えですが、本当に独自の方法で実行したい場合は、これを試してください。
正規化するには、まずヒストグラムを作成して、0 から 255 までの各値の出現回数をカウントします。次に、次のような方法で、両端から X パーセントの値を除外します。
for (i=lower=0;i< N*(X/100); lower++)
i+=count[lower];
//repeat in other direction for upper
今すぐ正規化します
A[i] = 255*(A[i]-lower)/(upper-lower)-128
-128..127 の範囲外の結果を破棄します。
これで、ゼロクロッシングを数えることができます。ノイズにだまされないようにするために、最後の数点の勾配を追跡し、平均勾配が正しい方向に進んでいる場合にのみ交差点をカウントすることをお勧めします。
この問題に対処する標準的な方法は、できれば実際の周波数の少なくとも 2 倍の 1 ブロックのデータを検討し (より多くのデータを取得することは悪いことではないため、少し過大評価することをお勧めします)、次にFFTを取得し、周波数が対応していると推測します。結果のFFTスペクトルの最大数に。
ところで、非常によく似た問題が以前にここで尋ねられました。それらの回答も検索できます。
フーリエ変換を使用すると、ゼロクロッシングをカウントするよりもはるかにノイズに影響されません。
編集:@WaveyDavey
FFT を実行する F# ライブラリを見つけました: ここから
結局のところ、私がこれまでに見つけた F# ユーザー向けの最高の無料実装は、今でも素晴らしい FFTW ライブラリです。彼らのサイトには、コンパイル済みの Windows DLL があります。私は、F# から FFTW へのスレッド セーフなアクセスを可能にする最小限のバインドを作成しました。パフォーマンスは優れており、32 ビット Windows XP Pro は 64 ビット Linux よりも最大 35% 遅いだけです。
これで、ドキュメントにあるはずのVB.net、C#などからF# libを呼び出すことができると確信しています
私があなたの説明からよく理解していれば、あなたが持っているのは、サインと定数といくつかのランダムなグリッチの組み合わせである信号です。言って、好き
x[n] = A*sin(f*n + phi) + B + N[n]
ここで、N[n] は除去したい「グリッチ」ノイズです。
グリッチが 1 サンプルの長さである場合、グリッチの長さよりも大きくなければならないメジアン フィルターを使用してそれらを除去できます。グリッチの両側に。長さ 1 のグリッチは、長さの中央値 3 サンプルで十分であることを意味します。
y[n] = median3(x[n])
中央値は次のように計算されます: フィルタリングする x のサンプル (x[n-1]、x[n]、x[n+1]) を取得し、それらを並べ替えます。出力は中央のものです。
ノイズ信号がなくなったので、一定の信号を取り除きます。バッファの長さが制限されていることがわかっているため、バッファ全体の平均を計算できます。それを引きます。
これで、単一の洞信号が得られました。ゼロクロッシングを数えることで、基本周波数を計算できるようになりました。前のサンプルが 0 未満であった、0 を超えるサンプルの量をカウントします。周期は、バッファーのサンプルの合計量をこれで割った値であり、頻度は周期の反対 (1/x) です。
私は大多数に行き、あなたが望むのはfftソリューションのようだと言いますが(fftアルゴリズムはかなり速いです)、何らかの理由でfftが答えでない場合は、次を使用してデータに正弦曲線を当てはめてみてくださいフィッティングプログラムとフィッティング周波数の読み取り。
Fitykを使用して、データをロードし、 fit to a*sin(b*x-c)
whereを使用2*pi/b
すると、フィッティング後の頻度が得られます。
Fityk は GUI から、スクリプト用のコマンドラインから使用でき、C++ API を備えているため、プログラムに直接含めることができます。
http://www.relisoft.com/Freeware/index.htmで Frequency Analyzer を入手して実行し、コードを確認してください。
「基本的なfft」をグーグルで検索しました。Visual Basic FFTあなたの質問は FFT を叫んでいますが、注意してください。DSP について少しでも理解せずに FFT を使用すると、理解できない、またはどこから来たのかわからない結果になる可能性があります。