問題タブ [signal-processing]
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.
audio - 周波数の対数除算を使用するFFTはありますか?
ウィキペディアのウェーブレットの記事には、次のテキストが含まれています。
離散ウェーブレット変換も計算が複雑ではなく、高速フーリエ変換のO(N log N)と比較してO(N)時間がかかります。この計算上の利点は、変換に固有のものではありませんが、FFTの等間隔の周波数除算とは対照的に、周波数の対数除算の選択を反映しています。
これは、線形ではなく周波数の対数除算を使用するFFTのようなアルゴリズムもあることを意味しますか?O(N)でもありますか?これは、多くのアプリケーションにとって明らかに望ましいことです。
audio - 再サンプリングされたオーディオ データのバイキュービック (またはその他の非線形) 補間をどのように行いますか?
私は、WAV ファイルをさまざまな速度で再生するコードを書いているので、波形が遅くてピッチが低くなるか、または速くてピッチが高くなります。私は現在、次のように単純な線形補間を使用しています。
これは問題なく動作しますが、再生周波数を下げた場合 (つまり、速度を落とした場合) にのみ問題なく聞こえる傾向があります。再生時にピッチを上げると、おそらくサンプル情報が失われるため、この方法では高周波のアーティファクトが生成される傾向があります。
バイキュービック法やその他の補間法は、私のコード例のように最も近い 2 つのサンプル値以外を使用してリサンプリングすることは知っていますが、ここで線形補間法を置き換えるためにプラグインできる適切なコード サンプル (できれば C#) が見つかりません。 .
誰かが良い例を知っていますか、または単純なバイキュービック補間法を書くことができますか? 必要に応じて、これに報奨金を出します。:)
更新: 補間メソッドの C# 実装をいくつか示します (最初のものは Donnie DeBoer に、2 番目のものは nosredna に感謝します)。
これらの関数では、x1 は推定しようとしているポイントの前のサンプル値であり、x2 はポイントの後のサンプル値です。x0 は x1 の左側、x3 は x2 の右側です。t は 0 から 1 になり、推定しているポイントと x1 ポイントの間の距離です。
Hermite 法はかなりうまく機能しているようで、ノイズがいくらか減少しているように見えます。さらに重要なことは、波をスピードアップすると、音が良くなるように見えることです。
iphone - iPhone の SIMD float ユニットを使用した float から integer への変換
現在、DSP 関連のコードを Shark で最適化しようとしていますが、浮動小数点から整数への変換に多くの時間を費やしていることがわかりました。
iPhone には ARM11 FP コプロセッサが搭載されているように見えるので、コードを FTOSI 命令に置き換えることができないかと考えています。ARM Web サイトで入手できるドキュメントがいくつかありますが、手動で最適化されたアセンブリをインライン化した経験はありません。誰かが前にそれをしたことがありますか?
コードをインライン化できると思います
しかし、指示が利用可能かどうかを確認するにはどうすればよいですか?
どうすれば自分の値を渡すことができますか?
EDIT1: Louis が既に指摘したように、「Compile for Thumb」をオフにしてコンパイルしていることを忘れていました。
EDIT2: float を unsigned Int ではなく signed Int16 に変換したいので、ARM 命令を FTOUI から FTOSI に変更しました。これは元の投稿の間違いでした。
audio - 一般的な周期波形の特定(正方形、正弦波、のこぎり波など)
ユーザーの操作がなければ、プログラムはADCからの記録にどのタイプの波形が存在するかをどのように識別しますか?
この質問のために:一定周波数の三角波、方形波、正弦波、半正弦波、またはのこぎり波。レベルと周波数は任意であり、ノイズ、少量の歪み、およびその他の欠陥があります。
私もいくつかの(素朴な)アイデアを提案します、そしてあなたはそれらを賛成または反対に投票することができます。
audio - 厳しく制限されたインタプリタ言語での作業
私はJSと呼ばれる組み込み言語でコーディングしています。
3つの関数を任意の順序で呼び出せるようにしたい。(ABC、ACB、BAC、BCA、CBA、CAB。)
トリック?この言語にはユーザー定義関数はありません。
条件付きおよびループ構造があります。
私には3つの選択肢があると思います。
- 大量のコードを複製します。
- プリプロセッサを記述します(これにより、重複するすべてのコードが作成されます)。
- 配列を使用して、ループの各パスで呼び出される機能を制御し、3回の反復でループを実行します。
私は#1が嫌いです。重複したコードは厄介です。失敗せずに何かを変更するにはどうすればよいですか?
#2は大丈夫だと思います。少なくとも、ソースに重複したコードはありません。しかし、私の出力コードは私がデバッグするものであり、それから分岐したいかどうか疑問に思います。プラス面として、私は言語に砂糖の束を追加することができました。
私の最善の策は#3だと思います。
他のアイデアはありますか?後藤はありません。機能はありません。既存のプリプロセッサはありません。
#3の面白いところは、それが本質的に悪名高い/スイッチの悪夢であるということです。
algorithm - 異なる周波数を持つ2つの信号間の有効な「位相差」を決定するアルゴリズム?
クイックバージョン:
持っている情報が各立ち上がりエッジが発生する時間だけである場合、異なる周波数を持つ 2 つの方形波信号間の「位相差」を決定するためにどのアルゴリズムを使用できますか?
詳細版:
私は組み込みソフトウェア プロジェクトに取り組んでおり、興味深い問題に遭遇しました。次の図に示すように、2 つのホール効果速度センサーからデータを収集しています。
注:ハイメが指摘したように、この図の信号は実際には同一の周波数を持っています
。実際のハードウェアには、2 つのターゲット ギア間にさらにいくつかのギアリング ステージがあり、その一部は噛み合った歯ではなくシャフトで接続されているため、異なる周波数を持つ 2 つの方形波になり、それらの間の比率は依然として一定です。要点をつかむために図を単純化したかったのですが、単純化しすぎたようです。/ノート
速度センサーは、周波数が各ギアの回転速度に正比例する方形波信号を出力します。方形波の立ち上がり (および立ち下がり) エッジは、単一の歯車の歯のリーディング (およびトレーリング) エッジがセンサーを通過するときに発生します。
各歯車の歯の数を知っており、この情報に基づいて、方形波信号の周波数に基づいて各歯車の回転速度を正確に測定できます。
周波数を測定するために、組み込みコントローラーの高速キャプチャ タイマー ピンに各速度センサー信号を接続しました。キャプチャ タイマーは、方形波信号の立ち上がりエッジを自動的に検出し、遷移が発生した時間を表す値をレジスタにロードし、割り込みをトリガーします。各信号のキャプチャ ポイントは、図に黄色で示されています。割り込みサービス ルーチンは次のようになります。
私がしたいこと:
これら 2 つの方形波信号の相対的なタイミングの小さな違いを検出できるようにしたいと考えています。より適切な用語がないため、これを「位相差」と呼んでいます。2 つの信号の周波数がまったく同じである場合、これは簡単で、位相差という用語を使用するのが適切です。
ここに私が得ているものがあります: 2 つの信号を長期間にわたって記録し、高速 (青) 信号を 16/9 の係数で人為的に遅くする (または「伸ばす」) 場合、それは低速 (赤) 信号とまったく同じ周波数を持ち、2 つの信号には測定可能な位相差、つまり赤信号割り込みと青信号割り込みの間の時間差があります。長期間にわたって信号を記録することなく、この同じ時間差 (または同等のもの) を計算したいと思います。組み込みコントローラーのリソースは限られているため、過去の遷移時間の大規模な配列を格納することはできません。
誰もこれに遭遇したことがありますか?実際のプロジェクトには、そのようなギアとセンサーの配置がいくつかあるため、再利用できる洗練されたアルゴリズムを探しています。前もって感謝します!
signal-processing - サインテーブル補間
最初にAM、後でFMなどを調整するSDRシステムをまとめたいと思います。これを行うために使用する予定のシステムには、ダイレクトデジタルシンセシス(DDS)のサインルックアップテーブルがあります。適切に調整するには、ミキサー(この場合は乗数)に供給される正弦波の周波数を正確に制御できる必要があります。線形補間は近いと思いますが、非線形法の方が良い結果が得られると思います。
サインテーブルに使用するための優れた高速補間方法は何ですか。ターゲットシステムでは、乗算と加算は安価です。分割にはコストがかかります。
編集:定数をスケーリングされた整数に正規化するために、乗算/シフト関数を使用して定数を実装することを計画しています。中間値はワイド加算を使用し、乗算は18ビットまたは17ビットを使用します。浮動小数点「事前計算」は使用できますが、ターゲットプラットフォームでは使用できません。「分割にはコストがかかる」とは、乗数と多くのコードを使用して実装する必要があることを意味します。それは考えられないことではありませんが、避けるべきです。ただし、真の浮動小数点IEEEメソッドは、カスタム実装だけでなく、このプラットフォームでもかなりの量のリソースを必要とします。
SDRの経験があれば役に立ちます。
audio - 整数 FM 復調
FM 復調に適したソフトウェア (または FPGA) 技術は何ですか? 私は MATLAB で実験してアルゴリズムを正しくしようとしましたが、結果が限られたアナログ参考資料に基づいていました。音声はわかりますが、フィルタリングで修正できない恐ろしい歪みがあります。最終的には、FPGA で整数の実装を使用できるようにしたいと考えていますが、最初に基本的な復調を機能させる必要があります。
FFT は、スペクトルが DC を中心とするように下に移動したことを示していますが、正しく聞こえません。
audio - 8ビットオーディオサンプルから16ビット
これが私の「週末」の趣味の問題です。
クラシックシンセサイザーのROMからの愛されているシングルサイクル波形がいくつかあります。
これらは8ビットのサンプルです(256の可能な値)。
それらはわずか8ビットであるため、ノイズフロアはかなり高くなります。これは量子化誤差によるものです。量子化誤差はかなり奇妙です。それはすべての周波数を少し台無しにします。
これらのサイクルを取り、それらの「クリーンな」16ビットバージョンを作成したいと思います。(はい、私は人々がダーティバージョンを愛していることを知っているので、ユーザーが好きな程度にダーティとクリーンの間を補間できるようにします。)
下位8ビットを永久に失ってしまったので、不可能に聞こえますよね?しかし、これはしばらくの間私の頭の後ろにありました、そして私はそれをすることができるとかなり確信しています。
これらは、再生のために何度も繰り返される単一サイクルの波形であるため、これは特殊なケースであることに注意してください。(もちろん、シンセは、エンベロープ、モジュレーション、フィルターのクロスフェードなど、サウンドを面白くするためにあらゆる種類のことを行います。)
個々のバイトサンプルごとに、私が本当に知っているのは、16ビットバージョンの256個の値の1つであるということです。(16ビット値が切り捨てられるか8ビットに丸められる逆のプロセスを想像してみてください。)
私の評価関数は、最小のノイズフロアを取得しようとしています。1つまたは複数のFFTでそれを判断できるはずです。
徹底的なテストにはおそらく永遠に時間がかかるので、低解像度の初回通過を行うことができます。または、ランダムに選択された値を(同じ8ビットバージョンを維持する既知の値の範囲内で)ランダムにプッシュして、評価を行い、よりクリーンなバージョンを維持しますか?それとも私ができるより速い何かがありますか?検索空間の他の場所にいくつかのより良い最小値があるかもしれないとき、私は極小値に陥る危険がありますか?私は他の同様の状況でそれが起こったことがあります。
おそらく隣接する値を調べることによって、私が行うことができる最初の推測はありますか?
編集:新しい波形を元の波形にサンプリングするという要件を削除すると、問題が簡単になると指摘する人もいます。それは本当だ。実際、よりクリーンなサウンドを探しているだけなら、解決策は簡単です。