Python 使用arduino播放音频时出现问题
我正在尝试创建一个系统,其中一部分需要将麦克风连接到arduino。我很少使用麦克风 我已将麦克风()连接到arduino nano。我想从这里录制音频数据Python 使用arduino播放音频时出现问题,python,arduino,audio-recording,microphone,Python,Arduino,Audio Recording,Microphone,我正在尝试创建一个系统,其中一部分需要将麦克风连接到arduino。我很少使用麦克风 我已将麦克风()连接到arduino nano。我想从这里录制音频数据 void setup() { Serial.begin(9600); pinMode(A2, INPUT); } void loop() { if(Serial.available()) { Serial.println(analogRead(A2)); } } 我将数据发送到计算机,并使用python脚
void setup() {
Serial.begin(9600);
pinMode(A2, INPUT);
}
void loop() {
if(Serial.available())
{
Serial.println(analogRead(A2));
}
}
我将数据发送到计算机,并使用python脚本进行记录,然后将其转换为WAV文件,以确保麦克风正常工作。我尝试了多种方法,使用ADC值,在-1和1之间缩放ADC值,转换为电压,然后缩放,但似乎没有任何效果。当我播放它的时候,我能听到的只是声音应该在哪里的几次点击
下面是我为使用println发送ADC值的配置编写的python代码。在这里,我使用pyserial库收集数据,并将其转换为浮点。然后我在-1和1之间标准化它。然后我将其保存在wav文件中
import serial
import matplotlib.pyplot as plt
import sounddevice as sd
import numpy as np
from scipy.io.wavfile import write
import pyaudio
import wave
def audnorm(aud):
normaud= -1+2*((aud-np.amin(aud))/(np.amax(aud)-np.amin(aud)))
return normaud
ser = serial.Serial('/dev/ttyACM0',115200)
ser.flushInput()
sound=[]
sound2=[]
while True:
try:
ser_bytes = ser.readline()
ser_bytes2= float(ser_bytes)
sound.append(ser_bytes2)
sound2.append(ser_bytes)
print(ser_bytes+"\t"+str(ser_bytes2))
print(type(ser_bytes))
except:
print("Keyboard Interrupt")
break
print(str(len(sound)))
soundnp= np.asarray(sound)
soundnp= soundnp - np.mean(soundnp)
soundnorm= audnorm(soundnp)
soundnormstr= [str(x) for x in soundnorm]
plt.plot(soundnp)
plt.show()
plt.plot(soundnorm)
plt.show()
wf = wave.open("output.wav", 'wb')
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(10000)
wf.writeframes(b''.join(soundnormstr))
wf.close()
我已经附上了我用这个代码记录的数据的2个图像
我做错了什么
要想在不失真的情况下录制,您试图录制的信号(我假设它是音频信号)需要三件事:1)以统一的速率采样,2)以每秒8000多个采样的速度采样,以便能够勉强听懂语音,3)以获取数据的速度传输或存储数据 re:1&2)有一个可指导的程序,用于在Arduino上录制高保真音频的所有混乱细节。它包含的信息比我在这里写的多得多。看
如果您的应用程序需要Arduino简单地检测是否有声音(如拍手声),则可以使用较低且不均匀的采样率。搜索“Arduino Clapper”获得一些想法。我同意布拉德福德的观点。您需要进行均匀采样以获取音频信号,并且8000 Hz是最小值 我认为你需要设置一个更高的串行波特率来达到这个采样频率。我稍微修改了你的代码,用示波器测量串行“传输”(加上模拟写入)的“实际最大频率” 在示波器上,它的频率约为9 kHz,仅在串行线上发送零。见附件。这可能是可行的(用于语音,而不是音乐)。Serial.available()在有可供Arduino读取的输入时为真。因为您没有向Arduino发送数据,所以可以删除if(Serial.available())语句。
void setup() {
// Serial.begin(9600);
Serial.begin(115200);
pinMode(A2, INPUT);
}
void loop() {
//if(Serial.available())
{
int val = analogRead(A2);
Serial.write(0);
}
}