2012-05-29 38 views
12

Tôi làm việc với thao tác âm thanh, thường sử dụng Matlab để tạo mẫu và C++ để thực hiện. Gần đây, tôi đã đọc về TDD. Tôi đã xem xét một vài ví dụ cơ bản và khá nhiệt tình về mô hình.Phát triển theo hướng thử nghiệm cho các thư viện xử lý tín hiệu

Hiện tại, tôi sử dụng những gì tôi sẽ xem xét cách tiếp cận 'được hỗ trợ thử nghiệm' toàn cầu. Đối với điều này, tôi viết các khối xử lý tín hiệu trong C++, và sau đó tôi tạo một tệp mex Matlab đơn giản có thể giao tiếp với các lớp của tôi. Sau đó tôi thêm chức năng, kiểm tra kết quả phù hợp với một kịch bản Matlab tương đương như tôi đi. Điều này làm việc ok, nhưng các bài kiểm tra trở nên lỗi thời một cách nhanh chóng khi hệ thống phát triển. Hơn nữa, tôi đang thử nghiệm toàn bộ hệ thống, không chỉ đơn vị. Nó sẽ là tốt đẹp để sử dụng một khuôn khổ TDD thành lập nơi tôi có thể có một bộ thử nghiệm, nhưng tôi không thấy làm thế nào tôi có thể xác nhận chức năng của các khối xử lý mà không có các bài kiểm tra phức tạp như mã được kiểm tra . Làm thế nào tôi có thể tạo ra các tín hiệu tham chiếu trong một thử nghiệm C++ để xác nhận một khối xử lý mà không cần thử nghiệm là một dạng tiên tri tự hoàn thành?

Nếu có ai có kinh nghiệm trong lĩnh vực này hoặc có thể đề xuất một số phương pháp tôi có thể đọc, thì điều đó thật tuyệt.

+1

Xử lý tín hiệu thử nghiệm +1 không dễ dàng; một lưu ý mặc dù: thử nghiệm rằng kết quả C++ giống như kết quả MATLAB chỉ chứng minh rằng điểm, nhưng không chứng minh rằng kết quả là chính xác: cả hai MATLAB và c + + có thể cung cấp cho cùng, không chính xác, kết quả – stijn

Trả lời

3

Tôi nghĩ thật tuyệt khi áp dụng các phương pháp TDD để xử lý tín hiệu (nó sẽ có lưu tôi tháng thời gian nếu tôi biết về nó năm trước khi tôi đã tự xử lý tín hiệu). Tôi nghĩ rằng chính là để phá vỡ hệ thống của bạn vào các thành phần mức thấp nhất có thể được kiểm tra một cách độc lập, ví dụ:

  • FFTs: tín hiệu thử nghiệm ở tần số biết: DC, Fs/N FFT, Fs/2 và giai đoạn khác nhau vv Kiểm tra các đỉnh và pha như bạn mong đợi, kiểm tra hằng số chuẩn hóa như bạn mong đợi
  • chọn đỉnh: kiểm tra xem bạn đã tìm đúng maxima/minima
  • Bộ lọc: tạo đầu vào ở tần số đã biết và kiểm tra biên độ và pha đầu ra như mong đợi.

Bạn không thể nhận được chính xác kết quả tương tự giữa C++ và Matlab, vì vậy bạn sẽ phải cung cấp giới hạn lỗi cho một số thử nghiệm. TDD là một cách tuyệt vời để không chỉ xác minh tính chính xác của mã mà bạn có mà còn thực sự hữu ích khi thử các triển khai khác nhau. Ví dụ: nếu bạn muốn thay thế một triển khai FFT bằng cách thực hiện khác, thường có sự khác biệt nhỏ với cách dữ liệu được đóng gói hoặc hằng số chuẩn hóa được sử dụng. TDD sẽ cung cấp cho bạn một mức độ tin cậy cao mà thư viện mới được tích hợp một cách chính xác.

2

Tôi làm điều gì đó tương tự để phát hiện heuristics, và chúng tôi có tải và tải các tập tin chụp và một khuôn khổ để có thể tải và tiêm chúng để thử nghiệm. Bạn có khả năng để nắm bắt các tín hiệu tham chiếu trong một tập tin và làm như vậy?

Đối với 2 xu của tôi liên quan đến TDD, đây là một cách tuyệt vời để phát triển, nhưng cũng như với hầu hết các mô hình, bạn không phải luôn tuân theo nó, có những lúc bạn nên biết cách bẻ cong các quy tắc một chút , để không viết quá nhiều mã/thử nghiệm. Tôi đọc về một cách tiếp cận mà nói hoàn toàn không có mã nên được viết cho đến khi một thử nghiệm được phát triển, mà đôi khi có thể là quá nghiêm ngặt.

Mặt khác, tôi luôn luôn muốn nói: "Nếu nó không được kiểm tra, nó bị hỏng" :)

1

Việc kiểm tra trở nên phức tạp hoặc phức tạp hơn mã đang được phát triển thì không sao.Nếu bạn thay đổi (cập nhật, refactor, sửa lỗi) mã và không phải là kiểm tra, kiểm tra đơn vị sẽ cảnh báo bạn rằng một cái gì đó đã thay đổi và cần được xem xét (là sửa lỗi cho chế độ A phải thay đổi chế độ B ?, v.v.)

Hơn nữa, bạn có thể duy trì các API cho các thành phần tính toán riêng lẻ và không chỉ cho toàn bộ hệ thống đầu cuối.

0

Tôi chỉ mới bắt đầu nghĩ về TDD trong bối cảnh xử lý tín hiệu, vì vậy tôi chỉ có thể thêm một chút vào các câu trả lời trước đó. Những gì tôi đã làm là khai thác một chút của chồng chất để kiểm tra nguyên thủy. Ví dụ, thử nghiệm một bộ lọc IIR, tôi đã xác minh độc lập các phần tử b0, b1 và b2 với đơn vị và tỷ lệ tăng, sau đó xác minh các phần tử a1 và a2 theo sau các phân rã được mô hình dễ dàng. Tín hiệu thử nghiệm của tôi là sự kết hợp các hàm dốc cho tử số và các hàm xung cho mẫu số. Tôi biết đó là một ví dụ tầm thường, nhưng quá trình này sẽ làm việc cho nhiều hoạt động tuyến tính. Các thử nghiệm cũng nên thực hiện các khu vực không ổn định và cho thấy rằng các đầu ra phát nổ một cách thích hợp.

Nói chung, tôi hy vọng rằng các phản ứng xung sẽ làm rất nhiều công việc cho tôi, vì nhiều trường hợp sẽ thấy chúng giảm xuống hàm lượng giác, có thể được tính toán độc lập. Tương tự, nếu hoạt động của bạn có mở rộng chuỗi, chức năng kiểm tra của bạn có thể thực hiện mở rộng theo thứ tự có liên quan và so sánh với khối xử lý của bạn. Nó sẽ chậm, nhưng nó sẽ hoạt động.

Các vấn đề liên quan