2012-05-29 3 views
12

저는 일반적으로 프로토 타입 작성을 위해 Matlab을 사용하고 구현을 위해 C++을 사용하여 오디오 조작을합니다. 최근에 나는 TDD에 대해 읽고 있었다. 필자는 몇 가지 기본 예를 살펴보고 패러다임에 대해 매우 열정적이다.신호 처리 라이브러리 용 테스트 기반 개발

현재 저는 글로벌 '테스트 지원'방식을 사용하고 있습니다. 이를 위해 C++로 신호 처리 블록을 작성한 다음 클래스와 인터페이스 할 수있는 간단한 Matlab mex 파일을 만듭니다. 이후에 내가 얻은 결과가 Matlab 스크립트와 일치하는지 확인하면서 기능을 추가했습니다. 이것은 정상적으로 작동하지만 시스템이 진화함에 따라 테스트는 더 이상 쓸모 없게됩니다. 더 나아가서, 나는 단지 단위가 아닌 전체 시스템을 시험하고있다.

테스트 슈트를 가질 수있는 기존 TDD 프레임 워크를 사용하는 것이 좋겠지 만 테스트중인 코드와 똑같이 복잡한 테스트가없는 처리 블록의 기능을 어떻게 검증 할 수 있는지는 알 수 없습니다 . C++ 테스트에서 참조 신호를 생성하여 자체 구현 예언의 형태가 아닌 테스트 블록을 검증하려면 어떻게해야합니까?

누구든지이 분야에 경험이 있거나 내가 읽을 수있는 방법을 제안 할 수 있다면 큰 도움이 될 것입니다.

+1

+1 신호 처리가 쉽지 않습니다. 한 노트 : 비록 그 C + + 결과는 MATLAB 결과와 동일 테스트 그 지점을 증명할 수 있지만 결과가 올바른지 증명하지 않습니다 : matlab 및 C++ 모두 같은, 부정확 한 결과를 줄 수 있습니다 – stijn

답변

3

을 나는 그것이 신호 처리하는 TDD 방식을 적용하는 좋은 생각 (그것이 나에게 저장 한 것이다 개월 몇 년 전에 내가 신호 처리를 할 때 알고 있었다면 시간.

  • 의 FFT : 등 DC FS +/NFFT FS +/2 및 다른 단계 : 알려진 주파수에서 테스트 신호 나는 키가 독립적으로 테스트 할 수있는 가장 낮은 수준의 구성 요소, 예를 들어으로 시스템을 파괴하는 것입니다 생각 피크 및 위상이 예상대로인지 확인하십시오. 정상화 상수가 예상대로인지 확인하십시오.
  • 최대 피킹 : 최대/최소값을 올바르게 테스트하십시오.
  • 필터 : 알려진 주파수에서 입력을 생성하고 출력 진폭 및 위상을 확인하십시오 예상대로입니다.

당신은 ++ 및 matlab에 C 사이에서 정확히 같은 결과를 얻을 가능성이있다, 그래서 당신은 시험의 일부에 오류 범위를 제공해야합니다. TDD는 코드의 정확성을 검증 할뿐만 아니라 다른 구현을 시도 할 때 매우 유용합니다. 예를 들어 한 FFT 구현을 다른 FFT 구현으로 대체하려는 경우 데이터가 포장되는 방식이나 사용되는 정규화 상수와 약간의 차이가있을 수 있습니다. TDD는 새 라이브러리가 올바르게 통합되었음을 높은 수준으로 확신합니다.

2

나는 휴리스틱 탐지와 비슷한 것을 수행하며, 우리는 많은 양의 캡처 파일과 테스트를 위해로드하고 삽입 할 수있는 프레임 워크를 가지고 있습니다. 파일에서 참조 신호를 캡처하고 동일한 작업을 수행 할 수 있습니까?

내 2 센트는 TDD와 관련하여 개발할 수있는 좋은 방법이지만, 대부분의 패러다임과 마찬가지로 항상 문자를 따르지 않아도됩니다. 규칙을 약간 구부릴 때가 있습니다. 너무 많은 쓰레기 코드/테스트를 작성하지 않도록합니다. 필자는 테스트가 개발 될 때까지 코드를 작성해서는 안되며, 때로는 너무 엄격 할 수 있다는 접근법에 대해서도 읽었습니다. 한편

, 내가 항상 말을 좋아한다 "는 테스트하지 않으면, 그 깨진"의 :

1

테스트가 개발중인 코드보다 복잡하거나 복잡 할 수도 있습니다.테스트가 아니라 코드를 변경 (업데이트, 리팩터링, 버그 수정)하면 단위 테스트에서 변경된 내용과 검토가 필요하다는 경고를 표시합니다 (모드 A가 B 모드로 변경되는 버그 수정)

또한 전체 종단 간 시스템뿐 아니라 개별 컴퓨팅 구성 요소에 대한 API를 유지 관리 할 수 ​​있습니다.

0

신호 처리와 관련하여 TDD에 대해서만 생각하기 시작 했으므로 이전 답변에 조금만 추가 할 수 있습니다. 내가 한 것은 기본을 테스트하기 위해 약간의 중첩을 사용합니다. 예를 들어, IIR 필터를 테스트 할 때, 단위 및 스케일 된 이득으로 b0, b1 및 b2 요소를 독립적으로 확인한 다음 쉽게 모델링 된 붕괴를 따르는 a1 및 a2 요소를 확인했습니다. 내 테스트 신호는 분자에 대한 램프 함수와 분모에 대한 임펄스 함수의 조합이었습니다. 나는 그것이 사소한 예다는 것을 알고 있지만, 프로세스는 많은 선형 작업을 위해 작동해야합니다. 또한 테스트는 불안정한 지역을 연습하고 출력이 적절하게 폭발하는지 보여야합니다.

일반적으로 임펄스 응답은 많은 상황에서 독립적으로 계산할 수있는 삼각 함수로 축소되기 때문에 많은 노력이 필요할 것으로 예상됩니다. 마찬가지로 작업에 계열 확장이있는 경우 테스트 함수가 관련 순서로 확장을 수행하고 처리 블록과 비교할 수 있습니다. 느려지지만 작동해야합니다.