Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ардуино - запись звука

Ср мар 06, 2024 08:59:16

На сматфоне запустить диктофон в режиме VOX и он будет записывать болтовню УКВистов пока Вас нет дома.

Re: Ардуино - запись звука

Ср мар 06, 2024 10:54:04

olegue тебе же сказали... задача творческая !
На сматфоне запустить диктофон... это не творчество.

shaaimars
звук (в качестве 16 бит 44.1 кГц) ардуина не потянет.
максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).


записывая каждый "сеанс" в отдельный файл на sd-карту - это ардуина потянет.

периодически вытаскивать эти файлы на смартфон через bluetoth - в ардуино нет bluetoth.))

кодек... не пробовал... может и потянет))

по I2S шине передать байты ардуине (?) - в ардуино нет I2S))


1) Как часто можно создавать файлы на sd карте? Если делать это каждые 1-2 секунды, никакого затыка не будет?
если правильно настроить... никакого затыка не будет.

2) Как расчитать, хватит ли аппаратных возможностей конкретного контроллера не только на запись звука по сигналу открытия шумодава, но еще и на передачу данных с sd карты через bluetoth модуль по запросу от смартфона? Собственно это самый главный вопрос, ибо не хочется ошибиться с покупкой ненужного для данного проекта железа.
:dont_know:
смотреть надо... в протеусе))
:tea:

надо понимать что ардуина изначально не расчитана на запись звука... поэтому придётся долго колдовать))

Re: Ардуино - запись звука

Ср мар 06, 2024 10:58:48

olegue тебе же сказали... задача творческая !
На сматфоне запустить диктофон... это не творчество.


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

Re: Ардуино - запись звука

Ср мар 06, 2024 17:52:55

На сматфоне запустить диктофон в режиме VOX и он будет записывать болтовню УКВистов пока Вас нет дома.

Такая схема уже частично была реализована, у нее есть много недостатков, которые всплывают при длительном использовании - отсутствие контроля над ОС (которая может просто завершить процесс спустя некоторое время, или зависнуть), большое энергопотребление. Плюс я не уверен, что смогу нормально наладить связь между двумя смартфонами, чтобы с одного на другой перекидывать файлы.

максимум что ардуина потянет - звук (в качестве 10 бит 44.1 кГц).

Это я уже успел узнать. Планируется использовать отдельную плату-кодек, большинство из которых нынче выдают I2S сигнал.... который не поддерживается ардуинами??? Получается, я перепутал ветку форума, и мне нужно брать сразу что-то ардуино-совместимое на основе esp32 или ARM-процессоров? :)))

P.S. Я правильно понимаю, что теоретически реализовать это возможно и на atmega 128, но не имеет смысла ввиду отсутсвия аппаратной поддержки 16 бит и i2s, и легче просто взять что-то помощнее да в сборе со всем необходимым? Но что конкретно? Слишком большой выбор, эх :shock:

Re: Ардуино - запись звука

Чт мар 07, 2024 05:00:31

Мой бывший коллега давненько реализовывал подобный проект.
Для получения 16 бит строился АЦП R-2R на выходных портах и использовался внутренний компаратор.
Писал на АСМе, и в решаемой задаче для используемых переменных хватало имеющихся регистров. Это позволило обойтись без пуш/поп при выполнении подпрограмм. А также полностью использовать имеющуюся оперативку под буферы данных.
Позднее к проекту добавился эзернет и "на вырост" была взята мега 128.

Re: Ардуино - запись звука

Чт мар 07, 2024 09:18:59

olegue писал(а):я внимательно и очень вдумчиво несколько раз перечитал...

тогда... за понимание ! )) :beer:
:))
shaaimars писал(а):я не уверен, что смогу нормально наладить связь между двумя смартфонами

:roll:
больших проблем не вижу...
shaaimars писал(а):Планируется использовать отдельную плату-кодек, большинство из которых нынче выдают I2S сигнал....

ну... если надо сжать файл... тогда можно))
хотя для обычной рации можно использовать и простой PCM без сжатия... там же данных не много.
:tea:
теоретически реализовать это возможно и на atmega 128, и на atmega 328...
atmega 328 лучше - частота выше - 20 мгц против 16 мгц у atmega 128.
а поддержку 16 бит и i2s можно сделать на чём угодно))
но не имеет смысла ввиду низкого быстродейстия и низкого качества звука...
:tea:
esp32 лучше.
esp32 даёт звук (в качестве 12 бит 44.1 кГц) против звук (в качестве 10 бит 44.1 кГц) у atmega 328...
esp32 - частота выше - 240 мгц и два ядра против 20 мгц у atmega 328.
esp32 энергопотребление в спячке ~2,5 микроампер... не намного больше чем у atmega 328 ~0,1 микроампер...
esp32 есть bluetoth.
и т.д.
:tea:
хотя не ясно зачем bluetoth... ви-фи работает дальше и быстрей.
у меня всё работает по ви-фи... и управление... и передача звука... и передача файлов... и т.д.
схема.jpg
(184.77 KiB) Скачиваний: 22

:tea:

Re: Ардуино - запись звука

Чт мар 07, 2024 11:53:08

shaaimars, Вы будете писать узкополосных УКВистов, позвольте узнать зачем Вам звук 16 бит, да и еще с таким конским сэмплрэйтом 44.1 кгц? Ардуино прекрасно справится с задачей записи на флэшку по SPI звука 8 бит 16кгц. Одна минута займет 8*16*60 =7.6 мБ места. Останется лишь вопрос передачи этих данных в телефон с целью прослушивания.
1. Вариант. Вынимаем флэшку и ставим в телефон. А другую флэшку ставим в устройство записи. Из недостатков: отсутсвтие творчества. Но я думаю, что по факту запуска первой части проекта творческий запал или спадет на нет или будут существенно скоректирован исходя из полученного опыта.
2. Здесь был упомянут Bluetooth. Отлично! Давайте помечтаем! Такой вариант я ранее не рассматривал. Но можно подключить плату HC-06 по UART, и скорость там, ну пускай 115200, мечтать так мечтать. Опустим проблемы сопряжение с телефоном, пускай их как бы нет. Теперь нужно что бы устройство все новые файлы (а точнее, сэмплы) по этому каналу передало в телефон. Намечается какой-то андроид блютуз сокет, ну должнен кто-то управлять этими байтами и заголовками и печь из них файлы.
3. И здесь появлятеся Роман и говорит: Олег, ты ж купил Ethernet Shield W5100 и все коды есть. Когда мы наконец увидим результат, то.е файлы на компе.

Добавлено after 29 minutes 42 seconds:
Ну да, блютуз это конечно не серьезно. Счас я подумаю как толкнуть на выход готовый файл по http или ftp. Это хорошая тема, либо через sim800 либо через esp8266. Оба варианта так себе. Ресурс делить придется если накладка произойдет. В умелых руках получилась бы конфетка, но кому это счас интересно.

Re: Ардуино - запись звука

Чт мар 07, 2024 15:47:44

ну... если надо сжать файл... тогда можно))

Вроде бы их используют в первую очередь как специальный быстродействующий 16-и-более-битный АЦП для качественной записи звука, ввиду отсутствия такового в esp32 и тем более в мегах. Поправьте меня, если не так.

Вы будете писать узкополосных УКВистов, позвольте узнать зачем Вам звук 16 бит, да и еще с таким конским сэмплрэйтом 44.1 кгц?

Чтобы не потерять качество записи. Все же связь, которую я хочу записать, не 8-битная, а обычная аналоговая. Количество занимаемой памяти не имеет значения. Имеет значение лишь то, сможет ли МК все это обработать, и смогут ли мои кривые ручонки все это собрать и запрограммировать в нечто рабочее :)))

Ну да, блютуз это конечно не серьезно.

Ой, да я пока что даже не думал об этом. Первоначальная цель - сделать запись звука в автономном устройстве с адекватным потреблением и стабильной работой на протяжении длительного времени. А блютуз или вифи - это на будущее :)))

Re: Ардуино - запись звука

Чт мар 07, 2024 19:40:43

готовый флэш- диктофон с кнопкой и всего то за 10 баксов, на кнопку посадить сигнал ШП со станции. https://aliexpress.ru/item/32996404674. ... 6931138413

Изображение

Добавлено after 3 minutes 42 seconds:
и питание вероятно тоже можно со станции ввязть. Питание флэшки 3.3 , вполне вероятно что и общее питания такое же будет.

15 баксов если в пересчете с наших.

Добавлено after 1 minute 37 seconds:
Но с "творчеством" опять беда, Кроме поключения к станции не за што и руки зацепить.

Добавлено after 2 hours 46 minutes 24 seconds:
Изображение

еще более функциональная игрушка. Доступ к записанным файлам по usb (вероятно по OTG тоже можно), Можно покумекать как передать на удаленное устройство.

Re: Ардуино - запись звука

Пт мар 08, 2024 11:28:13

shaaimars писал(а):Вроде бы их используют в первую очередь как специальный быстродействующий 16-и-более-битный АЦП для качественной записи звука, ввиду отсутствия такового в esp32 и тем более в мегах. Поправьте меня, если не так.

не понял...

1. звук подаём на любой АЦП. На выходе АЦП получаем PCM.
esp32 даёт звук 12 бит.
atmega328 даёт звук 10 бит.
телефон даёт звук 16 бит.
комп даёт звук 16 бит.
...
есть ещё мини ПК
Screenshot_1.jpg
(36.21 KiB) Скачиваний: 17

мини ПК даёт звук 16 бит.

но нам надо минимальное потребление... тогда остаётся esp32 или atmega328.

2. далее PCM поступает на блок сжатия... где кодек сжимает звук.
к примеру кодек MP3 сжимает звук в ~10 раз.
только не думаю что это надо для простой рации...

3. а далее пишем на обычную флешку... esp32 или atmega328 сойдёт)).

4. делее слушаем звук с флешки на компе или телефоне... по изернет или ви-фи.

всё просто)) вроде ))
:tea:

Добавлено after 8 minutes 3 seconds:
с ардуино на комп по протоколу http мы передавали в соседней теме...
фото...
jpg_1.jpg
(113.75 KiB) Скачиваний: 22

аудио...
mp3.jpg
(187.65 KiB) Скачиваний: 21

видео...
mp4.jpg
(179.99 KiB) Скачиваний: 21

:tea:
больше ничего по протоколу http мы не передаём)) причин тому масса...
:tea:

Re: Ардуино - запись звука

Пт мар 08, 2024 18:39:47

не понял...

https://aliexpress.ru/item/32893187079. ... 5826QdWpz3
https://www.chipdip.ru/product/pcm1808-audio-adc
https://www.chipdip.ru/product/ad1938-codec-v2
https://aliexpress.ru/item/100500649078 ... 4bc1D2zSWk
https://aliexpress.ru/item/100500546719 ... 4bc1D2zSWk
https://aliexpress.ru/item/33003473448. ... a5d9VjkrEw

Re: Ардуино - запись звука

Пт мар 08, 2024 23:49:30

ну... с таким ассортиментом )) не вижу проблем.
правда пропадает творчество.
:tea:

Re: Ардуино - запись звука

Сб мар 30, 2024 19:02:22

правда пропадает творчество.
:tea:

Ну, я бы поспорил. Даже установить IDE на ноут не смог - пришлось ставить на ПК.
Пока все железки не приехали, но уже возник один маааааленький вопросик - а нужно ли сбрасывать 0.3 вольта разницы между лог уровнями esp32 и моей рацией (которую я очень боюсь спалить)? И если да, то вопрос - что выбрать? На вскидку есть 3 варианта - делитель на резисторах, диод Шоттки, и буферная микросхема - вот только где бы найти такую, которая на выходе даст именно 3 вольта?

Re: Ардуино - запись звука

Вс мар 31, 2024 13:03:20

делитель на резисторах, диод любой... достаточно.
схему рисовать надо... куда чего подключается.
:tea:

Re: Ардуино - запись звука

Вт апр 16, 2024 19:31:18

надо ещё потестить... в разных условиях... на разных Wi-Fi...))

через домашний роутер всё работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с.
дом.jpg
(155.47 KiB) Скачиваний: 9

бесплатный Wi-Fi... тоже хорошо)) 22050 семплов * 16 бит = 352.800 бит/с.
банк.jpg
(117.25 KiB) Скачиваний: 8

а через 3G... очень плохо... нормально не поговорить)) булькает и зависает... большие потери пакетов...
3G_MTS.jpg
(166.77 KiB) Скачиваний: 8

3G для аудио и видео не подходит... надо 5G...))
хотя для управления умного дома 3G пойдёт.
:tea:
ещё 3G_MTS работает за NAT (он же шлюз)... он ещё и порты меняет... хотя это не проблема...
проблема в низкой скорости 3G_MTS.
:tea:

Re: Ардуино - запись звука

Ср апр 17, 2024 20:44:31

del

Re: Ардуино - запись звука

Пн апр 29, 2024 21:57:46

Это, конечно, какая-то жесть. :o
Вооружившись обрывочными примерами, разномастными библиотеками, в отсутствие нормального дебага в ардуино ide, решил я открыть для себя творческое пространство, так сказать.

Имеем
0) Рацию Yaesu vx-3r с распаянными проводками, а именно аудиовыход на наушники и выход на управляющий транзистор индикатора открытия шумодава.
1) Модуль с аудио АЦП/ЦАП под названием WM8960 (описание платы + даташит по ссылке).
2) Полный аналог платы DevKitC v4, с модулем esp32-wroom 32u (прошу прощения за формальный оффтоп, я все же не знаю куда тыкнуть этот пост, ибо в ветке ARM про ESP всего пара тем)
3) Sd адаптер


Имеем прямые руки и паяльник, фигачим паука из проводов и плат
СпойлерНа жпс модуль не обращать внимание, это на будущее (если оно настанет, с таким то прогрессом)Изображение

Пайка проверена, порты не перепутаны, все работает и моргает лампочками :idea:

Задача номер раз: записать по открытию шумодава хотя бы 5-секундный аудиофайл в формате WAV
Стратегия: брать куски кода из рабочих примеров для каждой из подзадач (работа с модулем ацп, работа с сд картой, и т.д.)

Модуль ацп проверен на работоспособность с помощью примера от Sparkfuns. Вкратце суть примера - орешь на микрофон и слышишь себя в наушниках :music:
Отсюда были взяты куски по работе с файловой системой и SD картой. Итого имеем следующего Франкенштейна
Спойлер
Код:
#include <Wire.h>
#include <SparkFun_WM8960_Arduino_Library.h>

#include "FS.h"
#include "SD.h"
// Click here to get the library: http://librarymanager/All#SparkFun_WM8960
WM8960 codec;

// Include I2S driver
#include <driver/i2s.h>

// Connections to I2S
#define I2S_WS 25
#define I2S_SD 17
#define I2S_SDO 4
#define I2S_SCK 16

// Use I2S Processor 0
#define I2S_PORT I2S_NUM_0

// Define input buffer length
#define bufferLen 64
uint8_t sBuffer[bufferLen*2];

size_t bytesIn = 0;
size_t bytesOut = 0;
boolean is_recording = false;
int file_num = 0;
byte header[44] = {};
fs::File fContent;
size_t audio_data_size = 0;
int testcounter = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Example 8 - I2S Passthough");

  pinMode(33, INPUT);

  Wire.begin();

  if (codec.begin() == false)  //Begin communication over I2C
  {
    Serial.println("The I2S device did not respond. Please check wiring.");
    while (1)
      ;  // Freeze
  }
  Serial.println("I2S device is connected properly.");

  codec_setup();

  // Set up I2S
  i2s_install();
  i2s_setpin();
  i2s_start(I2S_PORT);
}

void loop() {
  // Get I2S data and place in data buffer
  esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY);
  testcounter++;
  if (result == ESP_OK) {

    // Продолжение записи если флаг = 1
    if (is_recording) {
      // Запись
 
      audio_data_size += fContent.write(sBuffer, bufferLen*2);
      // Если сигнала на запись нет, убираем флаг, прекращаем запись и меняем header
      if (digitalRead(33) == 0) {
        is_recording = false;
        Serial.println("recording ended");
        CreateWavHeader(header, audio_data_size);
        fContent.seek(0);
        fContent.write((const byte *)header, sizeof(header));
        fContent.close();
        SD.end();
        Serial.println("File closed, card demounted succesfully");
      }
    }

    // Если флага записи нет
    else {
      // Если есть сигнал на запись, создаем файл и ставим флаг на запись
      if (digitalRead(33) == 1) {
        is_recording = true;
        file_num++;
        if (!SD.begin()) {
          Serial.println("Card Mount Failed");
        } else {
          Serial.println("Card mounted successfully");
        }
        fContent = SD.open("/file" + String(file_num, DEC) + ".wav", FILE_WRITE);
        fContent.write((const byte *)header, sizeof(header));
        Serial.println("file" + String(file_num, DEC) + " file created, recording started");
      }
    }
    // Send what we just received back to the codec
    esp_err_t result_w = i2s_write(I2S_PORT, &sBuffer, bytesIn, &bytesOut, portMAX_DELAY);

    // If there was an I2S write error, let us know on the serial terminal
    if (result_w != ESP_OK) {
      Serial.print("I2S write error.");
    }
  }
  // DelayMicroseconds(300); // Only hear to demonstrate how much time you have
  // to do things.
  // Do not do much in this main loop, or the audio won't pass through correctly.
  // With default settings (64 samples in buffer), you can spend up to 300
  // microseconds doing something in between passing each buffer of data
  // You can tweak the buffer length to get more time if you need it.
  // When bufferlength is 64, then you get ~300 microseconds
  // When bufferlength is 128, then you get ~600 microseconds
  // Note, as you increase bufferlength, then you are increasing latency between
  // ADC input to DAC output.
  // Latency may or may not be desired, depending on the project.
}

void codec_setup() {
  // General setup needed
  codec.enableVREF();
  codec.enableVMID();

  // Setup signal flow to the ADC

  codec.enableLMIC();
  codec.enableRMIC();

  // Connect from INPUT1 to "n" (aka inverting) inputs of PGAs.
  codec.connectLMN1();
  codec.connectRMN1();

  // Disable mutes on PGA inputs (aka INTPUT1)
  codec.disableLINMUTE();
  codec.disableRINMUTE();

  // Set pga volumes
  codec.setLINVOLDB(0.00);  // Valid options are -17.25dB to +30dB (0.75dB steps)
  codec.setRINVOLDB(0.00);  // Valid options are -17.25dB to +30dB (0.75dB steps)

  // Set input boosts to get inputs 1 to the boost mixers
  codec.setLMICBOOST(WM8960_MIC_BOOST_GAIN_0DB);
  codec.setRMICBOOST(WM8960_MIC_BOOST_GAIN_0DB);

  // Connect from MIC inputs (aka pga output) to boost mixers
  codec.connectLMIC2B();
  codec.connectRMIC2B();

  // Enable boost mixers
  codec.enableAINL();
  codec.enableAINR();

  // Disconnect LB2LO (booster to output mixer (analog bypass)
  // For this example, we are going to pass audio throught the ADC and DAC
  codec.disableLB2LO();
  codec.disableRB2RO();

  // Connect from DAC outputs to output mixer
  codec.enableLD2LO();
  codec.enableRD2RO();

  // Set gainstage between booster mixer and output mixer
  // For this loopback example, we are going to keep these as low as they go
  codec.setLB2LOVOL(WM8960_OUTPUT_MIXER_GAIN_NEG_21DB);
  codec.setRB2ROVOL(WM8960_OUTPUT_MIXER_GAIN_NEG_21DB);

  // Enable output mixers
  codec.enableLOMIX();
  codec.enableROMIX();

  // CLOCK STUFF, These settings will get you 44.1KHz sample rate, and class-d
  // freq at 705.6kHz
  codec.enablePLL();  // Needed for class-d amp clock
  codec.setPLLPRESCALE(WM8960_PLLPRESCALE_DIV_2);
  codec.setSMD(WM8960_PLL_MODE_FRACTIONAL);
  codec.setCLKSEL(WM8960_CLKSEL_PLL);
  codec.setSYSCLKDIV(WM8960_SYSCLK_DIV_BY_2);
  codec.setBCLKDIV(4);
  codec.setDCLKDIV(WM8960_DCLKDIV_16);
  codec.setPLLN(7);
  codec.setPLLK(0x86, 0xC2, 0x26);  // PLLK=86C226h
  //codec.setADCDIV(0); // Default is 000 (what we need for 44.1KHz)
  //codec.setDACDIV(0); // Default is 000 (what we need for 44.1KHz)
  codec.setWL(WM8960_WL_16BIT);

  codec.enablePeripheralMode();
  //codec.enableMasterMode();
  //codec.setALRCGPIO(); // Note, should not be changed while ADC is enabled.

  // Enable ADCs and DACs
  codec.enableAdcLeft();
  codec.enableAdcRight();
  codec.enableDacLeft();
  codec.enableDacRight();
  codec.disableDacMute();

  //codec.enableLoopBack(); // Loopback sends ADC data directly into DAC
  codec.disableLoopBack();

  // Default is "soft mute" on, so we must disable mute to make channels active
  codec.disableDacMute();

  codec.enableHeadphones();
  codec.enableOUT3MIX();  // Provides VMID as buffer for headphone ground

  Serial.println("Volume set to +0dB");
  codec.setHeadphoneVolumeDB(0.00);


  Serial.println("Codec Setup complete. Listen to left/right INPUT1 on Headphone outputs.");
}

void i2s_install() {
  // Set up I2S Processor configuration
  const i2s_driver_config_t i2s_config = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX),
    .sample_rate = 44100,
    .bits_per_sample = i2s_bits_per_sample_t(16),
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
    .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_MSB),
    .intr_alloc_flags = 0,
    .dma_buf_count = 8,
    .dma_buf_len = bufferLen,
    .use_apll = false,
    .tx_desc_auto_clear = false,
    .fixed_mclk = 0,
    .mclk_multiple = i2s_mclk_multiple_t(I2S_MCLK_MULTIPLE_DEFAULT),
    .bits_per_chan = i2s_bits_per_chan_t(I2S_BITS_PER_CHAN_DEFAULT)
  };

  i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
}

void i2s_setpin() {
  // Set I2S pin configuration
  const i2s_pin_config_t pin_config = {
    .mck_io_num = I2S_PIN_NO_CHANGE,
    .bck_io_num = I2S_SCK,
    .ws_io_num = I2S_WS,
    .data_out_num = I2S_SDO,
    .data_in_num = I2S_SD
  };

  i2s_set_pin(I2S_PORT, &pin_config);
}

void CreateWavHeader(byte *header, int waveDataSize) {
  header[0] = 'R';
  header[1] = 'I';
  header[2] = 'F';
  header[3] = 'F';
  unsigned int fileSizeMinus8 = waveDataSize + 44 - 8;
  header[4] = (byte)(fileSizeMinus8 & 0xFF);
  header[5] = (byte)((fileSizeMinus8 >> 8) & 0xFF);
  header[6] = (byte)((fileSizeMinus8 >> 16) & 0xFF);
  header[7] = (byte)((fileSizeMinus8 >> 24) & 0xFF);
  header[8] = 'W';
  header[9] = 'A';
  header[10] = 'V';
  header[11] = 'E';
  header[12] = 'f';
  header[13] = 'm';
  header[14] = 't';
  header[15] = ' ';
  header[16] = 0x10;  // linear PCM
  header[17] = 0x00;
  header[18] = 0x00;
  header[19] = 0x00;
  header[20] = 0x01;  // linear PCM
  header[21] = 0x00;
  header[22] = 0x02;  // stereo
  header[23] = 0x00;
  header[24] = 0x44;  // sampling rate 44100
  header[25] = 0xAC;
  header[26] = 0x00;
  header[27] = 0x00;
  header[28] = 0x10;  // Byte/sec = 44100x2x2 = 176400
  header[29] = 0xB1;
  header[30] = 0x02;
  header[31] = 0x00;
  header[32] = 0x04;  // 16bit stereo
  header[33] = 0x00;
  header[34] = 0x10;  // 16bit
  header[35] = 0x00;
  header[36] = 'd';
  header[37] = 'a';
  header[38] = 't';
  header[39] = 'a';
  header[40] = (byte)(waveDataSize & 0xFF);
  header[41] = (byte)((waveDataSize >> 8) & 0xFF);
  header[42] = (byte)((waveDataSize >> 16) & 0xFF);
  header[43] = (byte)((waveDataSize >> 24) & 0xFF);
}


TL;DR
Дабы не тратить время уважаемых форумчан, скажу вкратце - в примере есть буфер аудиоданных, который наполняется данными с i2s_read(), и далее отправляется обратно на i2s_write(). Я попытался его впихнуть на SD карту через file.write, на что тот ругнулся, т.к. буфер это массив типа uint16, а файл принимает только байты. Возможных решений много, но если просто изменить тип буфера на uint8, то функция "слышать себя в наушниках" никуда не пропадает и работает прекрасно. Казалось бы, все решено!?

Ага, как бы не так. Вот пример записи какого-то местного FM-радио - https://voca.ro/19Le1GeaxIgM
Вроде что-то слышно, а вроде и нифига не слышно. При этом в наушниках во время записи слышно хорошо!
Картинка этого же файла на audacity.
Изображение
Начало файла в hex
СпойлерПервые 3 строки с переводом в ascii
Код:
52 49 46 46 a4 64 21 00 57 41 56 45 66 6d 74 20
R I F F   d !   W A V E f m t 
10 00 00 00 01 00 02 00 44 ac 00 00 10 b1 02 00
                D             
04 00 10 00 64 61 74 61 80 64 21 00 16 00 01 80
        d a t a   d !         
16 80 00 80 13 00 00 80 12 00 03 80 0b 00 01 00
03 00 04 00 f8 ff 01 00 f3 ff 02 80 f2 ff 02 80
f0 7f 01 80 ee ff 03 00 f0 ff 01 00 f2 7f 04 80
fa ff 03 80 f9 7f 03 80 f9 7f 02 80 f7 ff 00 80
f6 7f 03 80 f4 7f 01 80 f4 7f 05 80 f5 ff 00 00

Туда-сюда, туда-сюда. В чем проблема, так и не понял. Есть идея побитово сравнить данные в буфере и данные на карте, но что-то слишком уж тяжело для меня это сделать (вывод бинарных данных с еспшки это какое-то иезуитство), поэтому обращаюсь сюда. Какой-то алгоритм делает из хороших данных, которые отправляются на АЦП и воспроизводятся в наушниках, плохие. Памагити :shock:
Ответить