【发布时间】:2023-01-10 03:20:53
【问题描述】:
我的目标是使用连接到 esp8266 (12E) 模拟引脚的驻极体麦克风录制音频,然后能够在另一台设备上播放该音频。我的电路是: 为了检查麦克风的输出,我将电路连接到示波器并得到:
在上面的“gif”中,您可以看到我对着麦克风说话时声音发出的波浪。 这是我在 esp8266 上的代码:
void loop() {
sensorValue = analogRead(sensorPin);
Serial.print(sensorValue);
Serial.print(" ");
}
我想在“Audacity”软件上播放音频以了解结果。因此,我从串行监视器复制了数字并将其粘贴到将数据映射到 (-1,1) 区间的 python 代码中:
def mapPoint(value, currentMin, currentMax, targetMin, targetMax):
currentInterval = currentMax - currentMin
targetInterval = targetMax - targetMin
valueScaled = float(value - currentMin) / float(currentInterval)
return round(targetMin + (valueScaled * targetInterval),5)
class mapper():
def __init__(self,raws):
self.raws=raws.split(" ")
self.raws=[float(i) for i in self.raws]
def mapAll(self):
self.mappeds=[mapPoint(i,min(self.raws),max(self.raws),-1,1) for i in self.raws ]
self.strmappeds=str(self.mappeds).replace(",","").replace("]","").replace("[","")
return self.strmappeds
它采用数字字符串,将它们映射到目标区间 (-1 ,+1) 并返回以空格 (" ") 分隔的数据字符串,准备导入 Audacity 软件。 (Tools>Sample Data Import 然后选择包含数据的文本文件)。将近5秒的语音导入数据的结果:
大约半秒钟,当我演奏时,我听到难以理解的噪音。我也尝试了较低的频率,但那里也只有噪音。
问题的可疑原因是:
1- Esp8266 无法足够快地读取模拟引脚以返回有意义的数据(这可能不是这种情况,因为它的时钟速度约为 100MHz)。
2- 软件收集数据和输出数据的方式不是最优化的方式(在循环中,Serial.print 等)
3-麦克风电路输出太吵。 (这可能是,但从示波器测试中观察到,我的声音必须对输出音频产生影响。这在大胆的情况下是听不到的)
4- 我为 Audacity 映射和准备数据的方式。
- 还有什么我可以尝试的吗?
- 那里有类似的项目吗? (令我惊讶的是,我找不到任何透明完成的东西!)
- 执行此操作的正确方法是什么? (因为它是一种非常有用且经济的录音、传输和分析音频的方法。)
【问题讨论】:
-
这可能与 Electronics 更相关,因为问题不是完全编程。分解你的问题清单。 1. 100MHz应该足够快,但要记住你在草图中做的任何其他事情。微型蟒蛇可能对于这种工作来说有点太慢了。 2. 串行通信对于音频而言不是最佳选择,您将受到波特率的限制。通常,音频接口至少是双缓冲的,因此当设备填充一个内存空间时,连接的机器会读取另一个内存空间。
-
从技术上讲,您需要 2 个 ESP 才能实现这一目标。一个循环写入一些外部存储器,另一个发送数据。3.输入将非常嘈杂。它不太可能是一个宽容的麦克风,但你应该能够得到一些可以理解的东西。你只是不会很快赢得格莱美奖。4.也许,您需要确保您正在编写原始字节。 ESP8266 ADC 引脚只有 10 位分辨率。您将浪费大量周期转换为 32 位浮点数并缩放为
-1.0f和1.0f。 -
如果你想录制,然后回放,你可以离线做很多这样的事情。您只需要将数据保存到一些内存中,稍后再读回即可。然后,您可以执行任何需要的后期处理,将原始字节缩放到合适的音频范围。 10 位不是标准,因此您可以扩展到 16 位并保持分辨率,或者缩小到 8 位以节省空间。 16 位可能最有意义
-
您现在遇到了数据存储问题。 SD 卡速度很慢,因此如果没有双缓冲(即 x2 ESP 和共享内存),您将在音频信号中出现不连续性。您可以写入 FRAM。您将需要大约 512KB 的 FRAM 来播放约 5 秒的音频。然后您需要编写 2 个程序或编写一些功能1个将信号记录到 RAM2个例如,按下按钮停止录制并开始将 RAM 的内容转储到 SD 卡或通过串行连接。
-
许多现代音频设备(如智能手机上的麦克风)不会像使用 ESP 模拟芯片那样读取 PCM 数据,而是使用某种 sigma delta modulator converter 电路。确保您的期望不会太离谱,这样您就不会对最终结果感到失望
标签: audio arduino esp8266 microphone adc