2012-05-29 14 views
12

私は、一般的にMatlabをプロトタイプに使用し、C++をオーディオ実装で使用して実装します。最近、私はTDDで読んでいます。私はいくつかの基本的な例を見てきましたが、そのパラダイムについては非常に熱心です。信号処理ライブラリのテスト駆動開発

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

私はテストスイートを持つことができる確立されたTDDフレームワークを使用するといいですが、テストするコードと同等に複雑なテストを行わずに処理ブロックの機能をどのように検証できるか分かりません。どのようにしてC + +テストで参照信号を生成して、自己完結預言の一形態であることなくテストブロックを検証するのですか?

誰でもこの分野での経験があるか、または私が読める方法論を提案できれば、それは素晴らしいことでしょう。

+1

+1信号処理は簡単ではありません。 MATLABの結果と同じであることをテストすることはその点を証明するだけで、結果が正しいことを証明するものではありません。matlabとC++の両方が同じ、間違った結果を与えるかもしれません – stijn

答えて

3

私はそれが(それは私の数ヶ月を保存していた信号処理するためにTDD方式を適用するのは素晴らしいことだと思います何年も前に私が信号処理をしていたときに私が知っていたのですが)。 I例えば、キーが独立してテストすることができる最低レベルのコンポーネントにあなたのシステムを打破することだと思う:

  • のFFT:DC、Fsを/ NFFT、Fsを/ 2と異なる位相など:既知の周波数でのテスト信号ピークとピークが期待どおりになっていることを確認してください。
  • ピークピッキング:最大/最小を正しく検出するテスト
  • フィルタ:既知の周波数で入力を生成し、出力の振幅と位相を確認してください期待通りです。

あなたはC++とMATLABの間から正確同じ結果を得ることはほとんどありませんので、あなたは、テストの一部に誤差範囲を供給する必要があります。 TDDは、コードの正確さを検証するだけでなく、さまざまな実装を試すときに本当に便利です。たとえば、あるFFT実装を別のFFT実装に置き換える場合は、データがパックされる方法や使用される正規化定数に若干の違いがあります。 TDDは、新しいライブラリが正しく統合されているという高い信頼を与えてくれます。

2

私はヒューリスティック検出に似たようなことを行います。また、読み込みと読み込みの負荷があり、キャプチャファイルと、テスト用にロードして注入できるフレームワークがあります。参照信号をファイルに取り込んで同じことをする可能性はありますか?

TDDに関する私の2セントは、開発するのに最適な方法ですが、ほとんどのパラダイムと同様に、いつも手紙に従わなければならない場合があります。あまりにも多くのスローアウェイコード/テストを書かないように。私は、テストが開発されるまでコードを書くべきではないと言ったアプローチについて読んでいます。

一方

、私はいつも言いたい:「そのがテストされていない場合は、その壊れた」:)

1

テストは開発中のコードと同じくらい複雑で複雑なものでもかまいません。テストではなくコードを変更(更新、リファクタリング、バグ修正)すると、単体テストは何かが変更され、再検討が必要であることを警告します(モードAのモードBを変更するはずです)

さらに、エンドツーエンドシステム全体ではなく、個々の計算コンポーネントのAPIを維持することができます。

0

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

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

関連する問題