Arduino 如何从声波值创建.PCM文件?
也许我有点迷路了,所以我想揭露我的问题,我真的很感谢任何能帮助我的人 我正在做一个在Arduino使用麦克风的项目,我能够得到声音的波形,它对我的声音或任何其他声音的反应都正常。 该话筒是一款通用话筒,名为LM393(我找不到任何指定该设备采样率频率的数据表),原理图是这样的(唯一的区别是我将其连接到模拟A0): 这是我在Arduino中使用的简单代码:Arduino 如何从声波值创建.PCM文件?,arduino,wav,pcm,Arduino,Wav,Pcm,也许我有点迷路了,所以我想揭露我的问题,我真的很感谢任何能帮助我的人 我正在做一个在Arduino使用麦克风的项目,我能够得到声音的波形,它对我的声音或任何其他声音的反应都正常。 该话筒是一款通用话筒,名为LM393(我找不到任何指定该设备采样率频率的数据表),原理图是这样的(唯一的区别是我将其连接到模拟A0): 这是我在Arduino中使用的简单代码: #include <SoftwareSerial.h> SoftwareSerial connection(10,11);
#include <SoftwareSerial.h>
SoftwareSerial connection(10,11);
int microphonePin = 0;
void setup() {
// put your setup code here, to run once:
pinMode(microphonePin, INPUT);
connection.begin(9600);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
int response = analogRead(microphonePin);
Serial.println(response);
connection.print(String(response) + " ");
delay(1);
}
我搜索了所有的网络,试图找到一个关于数据应该如何呈现的例子,但我搞不懂。考虑到每个样本的位是10(0..1023),我是否应该将这些int转换为二进制
我在这里的主要目的是记录我的声音。
因此,我的问题是,如何将这些int转换为PCM文件,或者更好地转换为.wav文件 音频只是一条曲线,但上面的绘图不是音频曲线。。。沉默只是一条平坦的线,更大的音量自然会让你随着高度的增加而抖动。。。为了准确捕获音频,您必须对音频信号进行采样,采样频率至少为您希望捕获的最高频率的两倍。。。例如,要捕获1kHz信号,采样率必须至少为2kHz。。。典型的CD质量音频使用44100 Hz的采样率,允许捕获高达22050 Hz的输入音频信号。。。您没有提及采样率-更新您的问题,告诉我们您正在使用什么 三个因素决定了捕获音频所需的存储
- 抽样率
- 钻头深度
- 信道数
637 shown above taken from a 10 bit signal which can vary from 0 to 1024
我的建议是生成一个位深为16位的PCM输出文件,将每个输入10位数据点分布在此PCM文件中的两个字节中。。。所以下一步是将每个10位整数转换成一对两个字节。。。注意endian的概念(小endian或大endian)。。。普通PCM或WAV使用小端码。。。此转换将需要执行移位操作。。。在高电平时,输出的第一个字节将只是10位整数中较低的8位。。。然后在10位整数上右移一位,这将成为写入PCM文件的输出的第二个字节
这是一个10位数字(以二进制显示)
要将该数字存储在两个字节中,则通过使用最低有效8位来填充第一个字节,如中所示
01011100
然后将同一原始编号0101011100
右移8位(8位),变成
01
并将其存储到第二个字节中。。。以上是概念上您需要做的,但是在代码中,比如在c语言中,它可以在几行代码中完成
Audacity可以呈现PCM音频,并且文件后缀与任何内容都没有关系,而不仅仅是。PCM。。。文件->导入->原始数据。。。用于编码的值取决于如何处理音频曲线。。。通常静默值为0,当曲线从正值摆动到负值时。。。如果您的数据在0到1024之间变化,这是无符号的,您可能希望对其进行规范化,使其在-1到+1之间变化,从而将其视为有符号的。。。各种这样的格式都会起作用
您面临两个挑战:(1)验证音频捕获和(2)使用原始音频正确剪切二进制文件。。。我强烈建议您编写一个循环,将sin曲线写入PCM文件,以便在进行捕获验证之前确定该过程
更新这是一些文档
和规格表
如中所述
看起来您使用的是数字输出,它是一个声音指示器(比较器),根据麦克风音量是否超过电位计控制的阈值,它给出高1024或低0。。。该电路板可能有一个模拟输出,该输出应为您提供音频曲线,但您必须将其输入ADC(模拟-数字转换器)以获得整数流
让我们知道你进展如何。。。这是非常可行的嗨,斯科特!非常完整的回答。我的第一个问题是,因为我使用的是一个通用的廉价麦克风,所以我找不到任何显示设备最小频率的数据表。有没有办法测量我每秒有多少点?关于您建议的移位操作,您的意思是执行从10位到16位的左移位,对吗?你为什么说右移呢?好的,根据你上次编辑的结果,你可以做一个简单的等式来得到采样率。我有16位的比特深度,mono,正如你所说的1,我可以根据我在1秒内得到的字节数清除采样率,对吗?是的。。。只需猜测采样率是44100赫兹,并用它运行。。。即使这是错误的,你仍然会得到可收听的音频
01011100
01