gpt4 book ai didi

arduino - Arduino能否以1-4 kHz的微秒采样音频?

转载 作者:行者123 更新时间:2023-12-02 19:54:58 24 4
gpt4 key购买 nike

我刚刚将electret microphone连接到Arduino,我想在1 kHz和4kHz的范围之间进行采样。

我知道这仅限于机器代码和ADC,所以我试图保持sketch简单。

是否可以在下面的草图中在这些频率之间进行采样?

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);
}
}

最佳答案

Arduino是一个原型平台,由许多硬件板和一个软件抽象层组成。对于这样的问题,考虑底层硬件的功能非常有用,因为它们提供了最终的限制。我假设您使用的是Arduino Uno / Nano,Due的情况则有所不同。

根据数据手册,每个ADC读数(超过第一个读数)都需要13个ADC时钟周期。 ADC时钟(不同于MCU)的时钟是通过将系统时钟除以至少2的某个因素得出的。因此,在16Mhz板上,这相当于每秒60万个采样。到目前为止,一切都很好。但是,这还不是故事的结局,您仍然需要读取数据。如果使用中断,即使您做的很简单,经验也表明您将损失大约100个时钟来进行中断处理。现在您的速度为每秒126K个样本。但这是理论上的最大值。

数据手册指出,要使ADC达到最高精度,需要50kHz-200kHz ADC时钟。在Arduino代码(在wiring.c中)中,选择的除数为128:

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


这意味着每次转换需要128 * 13 = 1764个时钟,理论上每秒最多可产生10K采样。考虑到 readAnalog()函数除了开始ADC转换并等待其完成之外还执行其他操作,因此它要差一些,但这并不会太糟。当然,这不涉及您的代码:您对 readAnalog()结果进行的任何处理都会使捕获更多样本更加困难。但是,是的,要以4Khz的频率进行捕获,您需要确保代码花费的采样周期少于1.5k时钟/样本。请注意,如果您像在发布的代码中一样进行五个读数,则如果您的代码做得很少,则最大捕获率将为2kHz。



至于如何捕获数据,您需要处理以下事实:未经放大的麦克风不会为您提供0-5V读数,如果您使用的是 analogRead()。实际上,麦克风的输出电压从正向负摆动,但是,除非您为麦克风提供电压偏移,否则ADC不会拾取负电压,而只能显示为零。



我不确定您将最小幅度与最大幅度进行比较的代码应该做什么。您要数字化音频吗?在这种情况下,您需要保存从 analogRead()收集的所有幅度读数,然后可以在另一台计算机上对它们进行FFT:Arduino很可能不够快,无法对数据进行频率分析。

关于arduino - Arduino能否以1-4 kHz的微秒采样音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com