Проблемы с воспроизведением аудио с использованием Arduino - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь создать систему, часть которой требует подключения микрофона к Arduino. Я не много работал с микрофонами.

Я подключил микрофон ( Электретный усилитель микрофона Adafruit - MAX9814 с автоматическим регулированием усиления ) к arduino nano. Я хочу записать аудиоданные с этого.

void setup() {
  Serial.begin(9600);
  pinMode(A2, INPUT);
}

void loop() {
  if(Serial.available())
  {
    Serial.println(analogRead(A2));
    }
}

Я отправляю данные на компьютер и записываю их, используя скрипт python, и преобразую их в файл WAV, чтобы убедиться, что микрофон работает правильно , Я пробовал несколько вещей, используя значение AD C, масштабируя значение AD C между -1 и 1, преобразовывая в напряжение и затем масштабируя его, но, похоже, ничего не работает. При воспроизведении все, что я слышу, это stati c с несколькими щелчками мыши, где должен быть голос.

Ниже приведен код python, который я написал для конфигурации, куда я отправляю значение AD C с использованием println. Здесь я собираю данные, используя библиотеку 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 изображения данных, которые я записал с использованием этого кода.

Что такое Я делаю не так?

Необработанные данные Нормализованные данные

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я согласен с Брэдфордом. Вам нужно будет сделать равномерную выборку, чтобы получить аудиосигнал, и минимум 8000 Гц.

Я думаю, что для достижения этой частоты дискретизации вам нужно установить более высокую скорость последовательной передачи. Я немного изменил ваш код, чтобы с помощью осциллографа измерить «фактическую максимальную частоту» последовательной «передачи» (плюс аналоговый шрифт).

void setup() {
  // Serial.begin(9600);
  Serial.begin(115200);
  pinMode(A2, INPUT);
}

void loop() {
  //if(Serial.available())
  {
    int val = analogRead(A2);
    Serial.write(0);
    }

}

На осциллографе это примерно 9 кГц, отправка просто нули на последовательном проводе. см. прилагаемый рисунок . Это может быть выполнимо (для речи, а не для музыки c).

0 голосов
/ 10 января 2020

Для записи без искажений сигнал, который вы пытаетесь записать - я предполагаю, что это аудиосигнал - требует трех вещей: 1) сэмплирование с одинаковой частотой, 2) сэмплирование с более чем 8000 сэмплов в секунду, чтобы иметь возможность едва понимать голос и 3) передавать или хранить данные так быстро, как вы их приобретаете.

re: 1 & 2) Существует инструктивный материал, который входит во все грязные детали записи высококачественного звука на Ардуино. Он содержит гораздо больше информации, чем я мог бы написать здесь. См. https://www.instructables.com/id/Arduino-Audio-Input/

Если ваше приложение требует, чтобы Arduino просто обнаруживал звук - например, хлопая пара рук - вы можете обойтись с более низким и неравномерным частота дискретизации. Ищите «Arduino Clapper», чтобы получить некоторые идеи.

...