問題タブ [kissfft]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
makefile - makefileレシピを理解する
私はネイティブコードを含むAndroidプロジェクトに取り組んでおり、NDKでKissFFTライブラリを使用しようとしています。ただし、KissFFTで使用されるmakefileの以下の部分を理解するのに苦労しています。誰かが私にこれを説明できますか?
kiss_fft.s
最初の行がターゲットとその前提条件を定義し、次の4行がレシピであり、その行3.
と4.
がコンパイラコマンドであることを私は知っています。2.
しかし、私は線を理解していません5.
どんな助けでも大歓迎です!
c - FFT - PCM データにウィンドウを適用する
getSpectrum
現在、FMODオーディオライブラリの機能を再現しようとしています。この関数は、現在再生中のバッファの PCM データを読み取り、このデータにウィンドウを適用し、FFT を適用してスペクトルを取得します。
各 float が 0 ~ 1 dB の float の配列を返します ( 10.0f * ( float)log10(val) * 2.0f
)。
自分が何をすべきかよくわからないので、説明します。
最初に、4096 バイトのバッファーで PCM データを取得します。ドキュメントによると、PCM データは左右のデータのペアであるサンプルで構成されています。
私の場合、上の画像のように 16 ビットのサンプルを使用しています。したがって、左チャンネルのみで作業したい場合は、左の PCM データを次のようにして短い配列に保存します。
したがって、サンプル = 4 バイトの場合、1024 個のサンプルがあります。つまり、左チャネルを表す 1024 ショートと右チャネルを表す 1024 ショートです。
FFT を実行するには、float 配列を用意し、データにウィンドウ (ハニング) を適用する必要があります。
wewin
は入力、i
は配列内の位置、および配列s
のサイズ (1024) です。
左チャンネルのみを取得するには:
次に、kiss_fft のおかげで FFT を実行します (実数から複素数へ)。kiss_fft_cpx *ouput
サイズ 1024/2+1 = 513 の (複合体の配列)を取得します。
各周波数の振幅を次のように計算します。
dB で計算します。
amp
は 0 と 1 の間ではありません。どこでデータを正規化する必要があるかわかりません (PCM データ上または最後)。また、PCM データにウィンドウを適用する方法もわかりません。
これは、getSpectrum 関数の結果と比較して、0 ~ 20kHz の曲から取得した結果です。(長方形の窓の場合)
どうすれば同じ結果を得ることができますか?
c - kiss_fftr の KissFFT 出力
320 個のサンプルを含むパケットで PCM データをソケット接続経由で受信しています。サウンドのサンプル レートは 1 秒あたり 8000 サンプルです。私はそれで次のようなことをしています:
その後、OpenAL バッファを埋めて再生します。kiss_fftr
すべて正常に動作しますが、との間でオーディオのフィルタリングを行いたいと思いますkiss_fftri
。これの出発点は、音を時間領域から周波数領域に変換することですが、関数からどのような種類のデータを受け取っているのかよくわかりませんkiss_fftr
。これらの複素数のそれぞれにどのような情報が格納されているか、その実数部と虚数部が周波数について教えてくれるもの. fft_out
そして、どの周波数がカバーされているか(どの周波数スパンが)、どのインデックスがどの周波数に対応しているかはわかりません。
私は信号処理とフーリエ変換のトピックの初心者です。
何か助けはありますか?
fft - KissFFT (kiss_fftr to kiss_fftri) - 元の信号を再構築する方法は?
KissFFT (1.2.9) を正しく使用する方法を理解するのに苦労しています。今のところ達成しようとしているのは、FFT を実行し、すぐに iFFT を実行して元の信号を再構築することだけです。以下のコード スニペットは、私が何をしているかを示しています。
私が見つけたのは、これが実際に実行時にクラッシュすることです。KissFFT構成を作成するときにサイズを2で割ると、クラッシュが停止することがわかりました。
ただし、再構築されたオーディオ データを再生すると、奇妙なパチパチ音を立ててほとんど無音になります。
誰かが私を正しい方向に向けることができますか?
どうもありがとう、P
編集 1:これは、KissFFT ヘッダー ファイルをインクルードし、FIXED_POINT 変数を定義する方法です。
これにより、typedef された 'kiss_fft_scalar' 型が int16_t (short) に強制されることが保証されます。
編集 2:ターゲット プラットフォームは Android であるため、Android.mk ファイルに以下も追加しました。
c - KissFFT forward / inverse でノイズが出力されるのはなぜですか?
Java アプリで KissFFT をネイティブに使用しようとしていますが、入力信号の順方向/逆方向が正常に返されません。信号の振幅はほとんど存在しません。スケーリング係数 (2N で割る) を取り除くと、結果は高調波ノイズになります。誰でもバグを見つけることができますか?
これが転送呼び出しです (GDX からコピーされたので、問題ないはずです!):
そして、これが逆です(私が書いたもので、おそらくエラーがあります;)):
math - KISSFFT のコンパイルとリンク
「すぐに使える」kissfftライブラリのコンパイルとリンクに新しい問題があります。Kissfft ライブラリをダウンロードし、テスト ディレクトリに展開しました。ディレクトリに入って「make testall」を実行すると、次のエラーが表示されます。これは、std c math ライブラリが適切にリンクされていないように見えます。
-lm オプションが含まれているため、makefile が数学ライブラリにリンクしようとしていることは明らかです。これでは意味がありません。以前、数学ライブラリに適切にリンクする多数のプログラムをコンパイルしました。どんな助けでも大歓迎です。ありがとう、-B
c++ - Kiss FFTは、データに変換するポイント数を掛けているようです
フーリエ変換についての私の限られた理解は、元のデータを変更せずに時間領域と周波数領域を切り替えることができるはずだということです。だから、これが私(私が思う)がしていることの要約です:
kiss_fft_next_fast_size(994)
1000を使用する必要があることを決定するために使用します。を使用してkiss_fft_cfgを
kiss_fft_alloc(...)
作成します。nfft = 1000
余分なポイントをゼロとしてパディングすることにより、入力データをサイズ994から1000に拡張します。
入力配列と出力配列とともに kiss_fft_cfgをに渡します。
kiss_fft(...)
を使用して逆kiss_fft_cfgを
kiss_fft_alloc(...)
作成します。nfft = 1000
逆のkiss_fft_cfgを渡して
kiss_fft(...)
、前の出力配列を入力します。元のデータが戻ってくることを期待していますが、各データを正確に1000倍大きくしています!
ここに完全な例を示しました。50行のコードが最後にあります。OPTIMAL_SIZE
各結果を(つまり1000)の値で割ることでこれを回避できますが、その修正により、理由がわからずに非常に不安になります。
私が間違っている単純な愚かなことを教えてください。
kissfft - C/のケプストラムコンセプトと適切な入力マイクを使用したkissfftピッチ検出
私は今、オーディオ信号処理の初心者です。ピッチ検出アルゴリズムを実装しようとしています。ケプストラムのいくつかのステップを見つけました。
したがって、FFTとIFFTのライブラリとしてkissfftとportaudioを使用して、これらのアルゴリズムをCで実装します。問題は、IFFTの結果を取得し、周波数を抽出する最後の手順を実行した後、期待した結果ではありません。(注。私は音符A(440Hz)で歌ってテストします)
Cepstrumの最後のステップを見逃しているのか、それとも間違っているのかわかりません。
テストするマイクは私のラップトップマイクです。これはコンデンサーマイクであることがわかっています。MICをDynamicMicに変更する必要がありますか、それとも通常のLabtopマイクを使用しても問題ありません。
聞いて私が実装したコードです
由来
c++ - Kiss FFTの速度は?
トピックの質問: ビッグオー記法での Kiss FFT はどのくらい速いですか? これはどこにも記載されていません。おそらく明らかな場所にあり、私は盲目です。
c++ - オーディオ サンプルに Kiss FFT を適用し、NaN 出力を取得しますか?
タイトルは私の問題を説明しています。
私がやろうとしていることは非常に簡単です:
- MP3 トラックを読み込む (libmpg123 経由)
- サンプルを読む
- サンプルに Kiss FFT を適用する
これまでに試したこと
問題は、オーディオ サンプル (16 ビット) を含むこの行kiss_fftr(config, (kiss_fft_scalar*) samples, spectrum);
で発生し、出力データを保持すると想定されています。samples
spectrum
関数が完了すると、デバッガー ウィンドウで次のように表示されます。
オーディオ (16 ビット エンコード) サンプルに Kiss FFT 関数を適用する方法の簡単な例を教えてもらえますか?