2013-04-09 46 views
5

Tôi vừa kết nối một electret microphone với Arduino và tôi muốn lấy mẫu giữa các phạm vi 1   kHz và 4   kHz.Âm thanh mẫu Arduino có thể tính bằng micro giây trong 1-4 kHz không?

Tôi hiểu điều này bị giới hạn đối với mã máy và ADC, vì vậy, tôi đang cố giữ đơn giản sketch.

Có thể lấy mẫu giữa các tần số này với hình vẽ dưới đây không?

const int analogPin = 0; 
int ledPin = 13; 

void setup() { 
    pinMode(ledPin, OUTPUT); 
} 

void loop() { 
    int mn = 1024; 
    int mx = 0; 
    for (int i = 0; i < 5; ++i) { 
     int val = analogRead(analogPin); 
     mn = min(mn, val); 
     mx = max(mx, val); 
    } 
    if (mx-mn >= 50) { 
     digitalWrite(ledPin, HIGH); 
    } 
    else { 
     digitalWrite(ledPin, LOW); 
    } 
} 
+0

Bạn đang sử dụng loại Arduino nào? – angelatlarge

Trả lời

0

Tôi đã nghe nói, hay đúng hơn là nhớ đọc, rằng ADC có thể xử lý lên đến 10k-mẫu trong một giây, vì vậy nó nên được OK lên đến 5   kHz. Tuy nhiên, tôi đã không thử điều này và tôi không có một liên kết để sao lưu nó vào lúc này.

Chỉ cần thử và xem.

Bây giờ tôi biết một số chức năng thư viện Arduino chậm, đáng chú ý là DigitalRead/Write có chi phí hàng trăm chu kỳ. Hầu hết trong số này là kiểm tra độ tin cậy cho phép mọi người thực hiện DigitalRead/Write mà không cần suy nghĩ nhiều về việc thiết lập mọi thứ.

Tuy nhiên, để siết chặt hiệu suất tối đa, bạn có thể xem xét cách viết riêng của bạn AnalogRead được tối ưu hóa cho trường hợp sử dụng của bạn.

Ít nhất một số liên kết về đề tài này:

+0

Tôi đã thử thư viện FUR Neurolecs chỉ để kiểm tra http://neuroelec.com/2011/03/fft-library-for-arduino/ và khi phòng thí nghiệm yên tĩnh, tôi có các kết quả sau http://i45.tinypic.com/ dfaqts.jpg. Bất kỳ ý tưởng đó có thể là gì? Tôi thậm chí còn rút phích cắm mic và nó vẫn còn thô ở đầu cuối. Có thể nó chỉ là tiếng ồn từ mạch? – user2119971

+0

Tần số là những gai ở đâu? Vâng mà tăng đột biến ... –

1

Arduino là một nền tảng tạo mẫu bao gồm một số các bo mạch phần cứng cộng với lớp trừu tượng phần mềm. Đối với một câu hỏi như thế này, nó rất hữu ích để xem xét khả năng của phần cứng cơ bản, vì chúng cung cấp các giới hạn cuối cùng. Tôi sẽ giả sử bạn đang sử dụng Arduino Uno/Nano, câu chuyện là khác nhau cho Do.

Theo biểu dữ liệu, mỗi lần đọc ADC (ngoài giá trị đầu tiên) mất 13 chu kỳ xung nhịp ADC. Đồng hồ ADC (khác với MCU) đồng hồ có nguồn gốc bằng cách chia đồng hồ hệ thống bởi một số yếu tố, ít nhất 2. Vì vậy, tại 16Mhz hội đồng quản trị số tiền này đến 0,6 triệu mẫu mỗi giây. Càng xa càng tốt. Tuy nhiên, đó không phải là kết thúc của câu chuyện, bạn vẫn cần phải đọc dữ liệu. Nếu bạn sử dụng ngắt, ngay cả khi bạn làm điều gì đó rất đơn giản, kinh nghiệm cho thấy rằng bạn sẽ mất khoảng 100 đồng hồ để làm gián đoạn quá trình xử lý. Bây giờ bạn đang xuống đến 126K mẫu/giây. Nhưng đây là một lý thuyết tối đa.

Biểu dữ liệu cho biết độ chính xác tối đa cho ADC yêu cầu đồng hồ ADC 50kHz - 200kHz. Trong đoạn mã Arduino (trong wiring.c), một yếu tố phân chia 128 được chọn:

sbi(ADCSRA, ADPS2); 
sbi(ADCSRA, ADPS1); 
sbi(ADCSRA, ADPS0); 

Điều này có nghĩa rằng mỗi chuyển đổi mất 128 * 13 = 1764 đồng hồ, trong đó sản lượng tối đa lý thuyết của 10K mẫu mỗi giây. Nó là một chút tồi tệ hơn cho rằng các chức năng readAnalog() làm một cái gì đó vượt ra ngoài chỉ cần bắt đầu chuyển đổi ADC và chờ đợi cho nó để kết thúc, nhưng nó không phải là quá nhiều tồi tệ hơn. Điều này không liên quan đến mã của bạn tất nhiên: bất kỳ xử lý bạn làm trên các kết quả của readAnalog() sẽ làm cho nó khó khăn hơn để nắm bắt nhiều mẫu hơn.Nhưng có, để nắm bắt tại 4Khz bạn sẽ cần phải đảm bảo rằng bạn mã dành ít hơn 1.5k chu kỳ đồng hồ/mẫu, mà nên được doable. Lưu ý rằng nếu bạn đang thực hiện năm lần đọc như bạn đang làm trong mã bạn đã đăng, tốc độ chụp tối đa sẽ là 2kHz nếu mã của bạn hoạt động rất ít.


Theo như làm thế nào để nắm bắt được dữ liệu, bạn cần phải thực hiện thỏa thuận với thực tế là micro mà không cần khuếch đại sẽ không cung cấp cho bạn 0-5V đọc mà bạn có thể mong đợi nếu bạn đang sử dụng analogRead(). Trong thực tế, điện áp đầu ra micro xoay từ dương sang âm, tuy nhiên, điện áp âm sẽ không được chọn bởi ADC, và hiển thị như chỉ 0, trừ khi bạn đưa micrô của bạn một điện áp bù đắp.


Tôi không chắc chắn mã của bạn so sánh biên độ tối thiểu với biên độ tối đa được cho là đang làm. Bạn có muốn số hóa âm thanh không? Trong trường hợp này, bạn cần phải lưu tất cả các chỉ số biên độ thu được từ analogRead(), và sau đó bạn có thể chạy FFT trên chúng trên một máy tính khác: Arduino rất có thể sẽ không đủ nhanh để phân tích tần suất trên dữ liệu.