Arduino 如何从声波值创建.PCM文件?

Arduino 如何从声波值创建.PCM文件?,arduino,wav,pcm,Arduino,Wav,Pcm,也许我有点迷路了,所以我想揭露我的问题,我真的很感谢任何能帮助我的人 我正在做一个在Arduino使用麦克风的项目,我能够得到声音的波形,它对我的声音或任何其他声音的反应都正常。 该话筒是一款通用话筒,名为LM393(我找不到任何指定该设备采样率频率的数据表),原理图是这样的(唯一的区别是我将其连接到模拟A0): 这是我在Arduino中使用的简单代码: #include <SoftwareSerial.h> SoftwareSerial connection(10,11);

也许我有点迷路了,所以我想揭露我的问题,我真的很感谢任何能帮助我的人

我正在做一个在Arduino使用麦克风的项目,我能够得到声音的波形,它对我的声音或任何其他声音的反应都正常。 该话筒是一款通用话筒,名为LM393(我找不到任何指定该设备采样率频率的数据表),原理图是这样的(唯一的区别是我将其连接到模拟A0):

这是我在Arduino中使用的简单代码:

#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的输入音频信号。。。您没有提及采样率-更新您的问题,告诉我们您正在使用什么

三个因素决定了捕获音频所需的存储

  • 抽样率
  • 钻头深度
  • 信道数
例如,让我们使用位深为10位(以16位的两个字节写入输出文件)且采样率为44.1 kHz的单声道(1通道)。。。然后一秒钟捕获的音频会给我们1*2*44100字节的数据。。。如果您知道捕获数据的文件大小,但不知道采样率,则可以使用上述关系计算它

。。。也许您正在绘制必须首先以某种方式转换的数据。。。或者,您可能正在以低于输入音频信号频率的采样率捕获音频强度值

假设您显示的数据点是10位音频样本,其中一个字节是8位,因此10位信号必须需要每个数据点两个字节的存储。。。比如说

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