Как создать файл .PCM из значений звуковой волны? - PullRequest
0 голосов
/ 23 мая 2018

Возможно, я немного растерялся, поэтому я хочу раскрыть свою проблему и очень ценю любого, кто может мне помочь.

Я работаю над проектом, в котором используется микрофон в Arduino, и я могу получить волну звука, и он хорошо реагирует на мой голос или любой другой звук.Микрофон является стандартным и называется LM393 (я не смог найти таблицу, в которой указана частота дискретизации этого устройства), и схема выглядит так (единственное отличие состоит в том, что я подключаю OUT к аналоговому A0): enter image description here

enter image description here

И этот простой код я использую в 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);  
}

Несколько комментариев: Аналоговый A0 отвечает значением в диапазоне 0 ... 1023 (бит на выборку равен 10?)

Как видите, я отправляю каждое значение, котороеЯ получаю сигнал от микрофона через Bluetooth (используя модуль HC-05) и получаю эти значения в приложении .NET Winforms.

Эти значения выглядят так на моей стороне .NET:

168 4 0 271 0 297 0 9 611 0 124 0 0 331 0 637 0 231 0 2 53 0 139 0 611 38 63 23 38 1 20 68 0 3 1 375 4 04 374 574 69 

Я искал всю сеть, пытаясь найти и пример того, как должны быть представлены данные, и я не могу понять это.Должен ли я преобразовать эти int в двоичные, учитывая, что битов на семпл равны 10 (0..1023)?

Моя главная цель здесь - записать звук моего голоса.Итак, мой вопрос, как я могу преобразовать эти int в файл PCM или, что еще лучше, в файл .wav ?

1 Ответ

0 голосов
/ 23 мая 2018

звук - это просто кривая, однако вышеприведенный график - это не кривая звука ... тишина - это просто плоская линия, большая громкость, естественно, дает колебания с увеличенной высотой ... для точного захвата звука необходимо сэмплировать аудиосигнал.по крайней мере вдвое больше частоты самой высокой частоты, которую вы хотите захватить ... например, чтобы захватить сигнал 1 кГц, ваша частота дискретизации должна быть не менее 2 кГц ... типичное аудио качества CD использует частоту дискретизации 44 100 Гц, которая позволяет захватыватьвходной аудиосигнал с частотой до 22 050 Гц, отдача или снятие ... вы не упоминаете частоту дискретизации - обновите свой вопрос, сообщив нам, что вы используете

Три фактора определяют объем памяти, необходимый для захвата звука

  • sample_rate
  • bit_depth
  • number_of_channels

, например, позволяет использовать моно (1 канал) с разрядностью 10 бит (записывается в выходной файл как двабайт (16 бит) и частоту дискретизации 44,1 кГц ... тогда одна секунда захваченного звука дает нам 1 * 2 * 44100 байтов данных ... если вы знаете размер файла захваченных данных и не знаете, скажем, частоту дискретизации, вы можете рассчитать ее, используя вышеуказанное соотношение

... возможно, вы строите данные, которые сначала должны быть преобразованыкаким-то образом ... или, возможно, вы захватываете значения интенсивности звука с более медленной частотой дискретизации, чем частота вашего входного аудиосигнала

Предполагая, что точки данных, которые вы показываете, являются вашими 10-битными аудиосэмплами, где один байт8 бит и т. Д. 10-битный сигнал должен требовать два байта памяти на одну точку данных ... например

637 shown above taken from a 10 bit signal which can vary from 0 to 1024

Мой совет - создать выходной файл PCM с битовой глубиной 16 бит, где выраспределить каждую входную 10-битную точку данных по двум байтам в этом файле PCM ... поэтому следующим шагом является преобразование каждого 10-битного целого числа в пару из двух байтов ... обратите внимание на понятие порядка байтов (little-endian или big endian)... обычный PCM или WAV использует порядковый номер с прямым порядком байтов ... это преобразование потребует выполнения операции сдвига ... при высокойgh level, первый байт вывода будет просто младшими 8 битами 10-битного целого числа ... затем выполните сдвиг бит вправо для этого 10-битного целого числа, которое затем станет вторым байтом вывода, записанного в файл PCM

здесь 10-битное число (показано в двоичном виде)

0101011100   all 10 bits shown 
01  01011100 same data separated into two byte

most significant byte  01   least significant byte  01011100

для сохранения этого числа в два байта, а затем заполнение первого байта, потребляя младшие 8 бит, как в

01011100   

затем сдвиньте вправо тот же исходный номер 0101011100 на 8 позиций (8 бит), который становится

01

и сохраните его во втором байте ... выше концептуально, что вам нужно сделатьоднако в коде, скажем, на языке c, это можно сделать в виде пары строк кода

Audacity может воспроизводить звук PCM, а суффикс файла не имеет значения, может быть чем угодно, не только .PCM ... File -> Import -> Необработанные данные ... значения, которые вы используете для кодирования, зависят от того, как вы обрабатываете звуковую кривую ... обычно тишина равна 0, тогда как кривая колеблется от положительных до отрицательных значений ... если выВаши данные варьируются от 0 до 1024, что без знака, вы можете их нормализовать, поэтому вместо этого они будут варьироваться от -1 до +1, поэтому они считаются подписанными ... Различные такие форматы будут работать

У вас есть две проблемы: (1) проверить ваш аудиозахват и (2) правильно вырезать двоичный файл с необработанным аудио ... Я настоятельно рекомендую вам записать цикл, чтобы записать кривую греха в файл PCM, чтобы закрепить этот процесс, прежде чем приступить к битве при проверке захвата

Обновление вот некоторые документы http://www.mpja.com/download/31072mp.pdf

и спецификации http://www.ti.com/lit/ds/symlink/lm393-n.pdf, как упомянуто в https://forum.arduino.cc/index.php?topic=292533.0

Похож на васиспользуется цифровой выход, который является звуковым индикатором (компаратором), который выдает либо высокое 1024, либо низкое 0 в зависимости от того, превышает ли громкость микрофона пороговое значение, контролируемое потенциометром ... плата может иметь аналоговый выход, который должен давать вам звуковую кривуюоднако вы должны передать его в АЦП (аналоговый цифровой преобразователь), чтобы получить поток целых чисел

дайте нам знать, как вы поживаете ... это очень выполнимо

...