Phát, giải mã DTMF và Call Progress không cần MT88xx
1. Phát DTMF không cần MT8888: dùng chế độ PWM phát ra 1 chân OCx, làm theo App Note AVR314: DTMF Genarator.
2. Giải mã DTMF và Call Progress: làm theo App Note AT3344: AVR Phone Recorder & Telephony Platform.
Làm được 2 mục trên sẽ tiết kiệm được 7 pin trên AVR so với dùng MT8888.
Mục 1 mình đã làm xong, trong tài liệu tương đối dễ hiểu (Chỉ tốn 1 Timer). Các bác chú ý bảng tính toán giá bảng trị sin trong AppNote chưa chính xác -> Khi phát sẽ sai một vài số. Dùng Excel tính lại công thức sẽ phát ra DTMF chính xác.
Mục 2 làm theo mà chưa được. Không biết có bác nào làm được chưa?
Theo tài liệu, việc giải mã dựa vào giải thuật Goertzel để phát hiện ra 1 tần số trong tín hiệu.
Về giải thuật Goertzel, mình thử đọc qua nhưng để hiểu được là điệp vụ bất khả thi. Không tin các bác thử xem, sẽ choáng ngay.
AVR nhận tín hiệu audio vào qua chân ADC0, tần số lấy mẫu tín hiệu 8Khz (125us).
ADC được kích hoạt tự động dựa vào ngắt của 1 timer -> thiết lập ở tần số 8Khz.
Giá trị ADC được gán vào biến sample16.
Tín hiệu được phân tích trên một block N mẫu. N lấy bằng 206 -> để giải mã tín hiệu phải có thời gian ít nhất = 125us x 206 ~ 25.75ms.
Các giá trị tần số của DTMF và Call Progress (CP) được tính toán trước để ra một hệ số dùng trong giải thuật Goertzel.
Vì làm theo không thành công nên mình xem lại giải thuật xử lý kèm theo, hoặc là mình không hiểu hoặc là giải thuật tác giả đưa ra chưa đúng !!?
Mình thử phiên lại quá trình xử lý mẫu thành vòng lặp từ ngắt
MAX_ITEM ở đây = 9 tần số DTMF và CP cần xét.
Theo đoạn code trên, cứ 10 mẫu -> nn++ -> tăng chỉ mục tần số cần xét lên.
-> sau khi xét hết 9 tần số tương ứng với 90 mẫu (nn chạy từ 0 đến 8) -> nn tiếp tục tăng.
nn = MAX_ITEM = 9 -> lấy ra kết quả nếu có.
Sau 100 mẫu nn tiếp tục tăng với giá trị nn > MAX_ITEM (nn=10), không thấy xử lý tiếp.
Từ mẫu 101 đến mẫu 206 -> chương trình không làm gì ??
Vậy là code có vấn đề hay mình có vấn đề ??
Các bác nào làm rồi thì giúp với nhé. Bác nào chưa làm có thời gian rỗi thì ngâm cứu thử.
Rất mong các bác quan tâm.
http://www.circuitcellar.com/avr2006/winners/AT3344.htm
AT3344: AVR Phone Recorder & Telephony Platform
1. Phát DTMF không cần MT8888: dùng chế độ PWM phát ra 1 chân OCx, làm theo App Note AVR314: DTMF Genarator.
2. Giải mã DTMF và Call Progress: làm theo App Note AT3344: AVR Phone Recorder & Telephony Platform.
Làm được 2 mục trên sẽ tiết kiệm được 7 pin trên AVR so với dùng MT8888.
Mục 1 mình đã làm xong, trong tài liệu tương đối dễ hiểu (Chỉ tốn 1 Timer). Các bác chú ý bảng tính toán giá bảng trị sin trong AppNote chưa chính xác -> Khi phát sẽ sai một vài số. Dùng Excel tính lại công thức sẽ phát ra DTMF chính xác.
Mục 2 làm theo mà chưa được. Không biết có bác nào làm được chưa?
Theo tài liệu, việc giải mã dựa vào giải thuật Goertzel để phát hiện ra 1 tần số trong tín hiệu.
Về giải thuật Goertzel, mình thử đọc qua nhưng để hiểu được là điệp vụ bất khả thi. Không tin các bác thử xem, sẽ choáng ngay.
AVR nhận tín hiệu audio vào qua chân ADC0, tần số lấy mẫu tín hiệu 8Khz (125us).
ADC được kích hoạt tự động dựa vào ngắt của 1 timer -> thiết lập ở tần số 8Khz.
Giá trị ADC được gán vào biến sample16.
Tín hiệu được phân tích trên một block N mẫu. N lấy bằng 206 -> để giải mã tín hiệu phải có thời gian ít nhất = 125us x 206 ~ 25.75ms.
Các giá trị tần số của DTMF và Call Progress (CP) được tính toán trước để ra một hệ số dùng trong giải thuật Goertzel.
Vì làm theo không thành công nên mình xem lại giải thuật xử lý kèm theo, hoặc là mình không hiểu hoặc là giải thuật tác giả đưa ra chưa đúng !!?
Mình thử phiên lại quá trình xử lý mẫu thành vòng lặp từ ngắt
Code:
while (1) { nn=0; // -> index của bảng tần số DTMF và CP cần giải mã gcount=0; -> đếm số mẫu while (gcount<N_sample) { for (cc=0; cc<10; cc++) { lấy mẫu tín hiệu ADC -> giá trị biến sample16; tính toán, xử lý các hệ số; if (nn<MAX_ITEM) { xử lý, tính toán; nếu phát hiện có tín hiệu -> biến tích lũy; } else if (nn=MAX_ITEM) { lấy ra kết quả từ biến tích lũy; } gcount++; } nn++; } //end while } //end while (1)
Theo đoạn code trên, cứ 10 mẫu -> nn++ -> tăng chỉ mục tần số cần xét lên.
-> sau khi xét hết 9 tần số tương ứng với 90 mẫu (nn chạy từ 0 đến 8) -> nn tiếp tục tăng.
nn = MAX_ITEM = 9 -> lấy ra kết quả nếu có.
Sau 100 mẫu nn tiếp tục tăng với giá trị nn > MAX_ITEM (nn=10), không thấy xử lý tiếp.
Từ mẫu 101 đến mẫu 206 -> chương trình không làm gì ??
Vậy là code có vấn đề hay mình có vấn đề ??
Các bác nào làm rồi thì giúp với nhé. Bác nào chưa làm có thời gian rỗi thì ngâm cứu thử.
Rất mong các bác quan tâm.
http://www.circuitcellar.com/avr2006/winners/AT3344.htm
AT3344: AVR Phone Recorder & Telephony Platform
Comment