12

私はオーディオ操作に取り組んでおり、通常、プロトタイピングには Matlab を使用し、実装には C++ を使用します。最近、私はTDDについて読んでいます。私はいくつかの基本的な例を見てきましたが、このパラダイムについて非常に熱心です。

現時点では、グローバルな「テスト支援」アプローチと考えられるものを使用しています。このために、信号処理ブロックを C++ で記述し、クラスとインターフェイスできる単純な Matlab mex ファイルを作成します。その後、機能を追加し、結果が同等の Matlab スクリプトと一致することを確認します。これは問題なく動作しますが、システムが進化するにつれて、テストはすぐに時代遅れになります。さらに、ユニットだけでなく、システム全体をテストしています。

テスト スイートを使用できる確立された TDD フレームワークを使用できればよいのですが、テスト対象のコードと同じくらい複雑なテストを行わずに、処理ブロックの機能を検証する方法がわかりません。C++ テストで参照信号を生成して、テストが自己実現的予言の形式でなくても、処理ブロックを検証するにはどうすればよいですか?

誰かがこの分野での経験を持っているか、私が読むことができるいくつかの方法論を提案できるなら、それは素晴らしいことです.

4

4 に答える 4

3

TDD アプローチを信号処理に適用するのは素晴らしいことだと思います (何年も前に自分で信号処理を行っていたときにそのことを知っていれば、何ヶ月も時間を節約できたでしょう)。重要なのは、システムを個別にテストできる最低レベルのコンポーネントに分解することだと思います。たとえば、次のようになります。

  • FFT: 既知の周波数での信号のテスト: DC、Fs/Nfft、Fs/2、およびさまざまな位相など。ピークと位相が期待どおりであることを確認し、正規化定数が期待どおりであることを確認します。
  • ピークピッキング: 最大値/最小値を正しく見つけることをテストします
  • フィルター: 既知の周波数で入力を生成し、出力の振幅と位相が期待どおりであることを確認します。

C++ と Matlab の間でまったく同じ結果が得られる可能性は低いため、一部のテストではエラー境界を指定する必要があります。TDD は、コードの正確性を検証する優れた方法であるだけでなく、さまざまな実装を試すときにも非常に役立ちます。たとえば、ある FFT 実装を別の FFT 実装に置き換える場合、多くの場合、データのパック方法や使用される正規化定数にわずかな違いがあります。TDD により、新しいライブラリが正しく統合されているという高い信頼が得られます。

于 2012-05-29T14:22:58.167 に答える
2

ヒューリスティック検出についても同様のことを行っています。大量のキャプチャ ファイルと、テスト用にそれらをロードして挿入できるフレームワークがあります。基準信号をファイルに取り込み、同じことを行う可能性はありますか?

TDD に関する私の 2 セントについては、開発するのに最適な方法ですが、ほとんどのパラダイムと同様に、常にそれに従う必要はありません。ルールを少し曲げる方法を知っておく必要がある場合があります。使い捨てのコード/テストを書きすぎる。テストが開発されるまで絶対にコードを書くべきではないという 1 つのアプローチについて読みましたが、これは時には厳しすぎる場合があります。

一方、私はいつも「テストされていない場合、壊れている」と言いたいです:)

于 2012-05-29T09:22:47.130 に答える
1

テストが開発中のコードと同じくらい複雑であっても、より複雑であっても問題ありません。テストではなくコードを変更(更新、リファクタリング、バグ修正)した場合、単体テストは何かが変更され、レビューする必要があることを警告します(モードAのバグ修正はモードBを変更することになっていますか?など)

さらに、エンドツーエンドシステム全体だけでなく、個々のコンピューティングコンポーネントのAPIを維持できます。

于 2012-05-29T15:16:07.717 に答える
0

信号処理のコンテキストで TDD について考え始めたばかりなので、以前の回答に少しだけ追加できます。私が行ったことは、プリミティブをテストするために少し重ね合わせを利用することです。たとえば、IIR フィルターのテストでは、b0、b1、および b2 要素を単位およびスケーリングされたゲインで個別に検証し、次に、簡単にモデル化された減衰に従う a1 および a2 要素を検証しました。私のテスト信号は、分子のランプ関数と分母のインパルス関数の組み合わせでした。些細な例であることはわかっていますが、このプロセスは多くの線形操作で機能するはずです。テストでは、不安定な領域も実行し、出力が適切に爆発することを示す必要があります。

一般に、インパルス応答は、多くの状況で、独立して計算できる三角関数に縮小されるため、多くの作業を行うと予想しています。同様に、操作に一連の展開がある場合、テスト関数は関連する順序への展開を実行し、処理ブロックと比較できます。遅くなりますが、うまくいくはずです。

于 2015-08-17T08:29:49.593 に答える