Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用arduino播放音频时出现问题_Python_Arduino_Audio Recording_Microphone - Fatal编程技术网

Python 使用arduino播放音频时出现问题

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脚

我正在尝试创建一个系统,其中一部分需要将麦克风连接到arduino。我很少使用麦克风

我已将麦克风()连接到arduino nano。我想从这里录制音频数据

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

}