Ваша частота дискретизации связана с вашей реализацией цикла (как вы обнаружили).Это также вызовет дрожание в вашей частоте дискретизации, поскольку разные пути кода будут занимать разное количество времени, а подпрограммы обработки прерываний также украдут циклы ЦП.
Этот джиттер будет одной из причин искажения в ваших выходных данных.
Когда я слушаю файл audio.raw, я слышу свой голос, но скорость может быть в 5-10 раз выше обычной.
ESP8266 имеет аппаратное обеспечениеUART, поэтому код может потенциально загружать буфер FIFO UART быстрее, чем он может выводить.Это будет источником воспринимаемой более высокой частоты дискретизации, но также может вызвать дрожание или потерю данных при заполнении буфера.В зависимости от реализации, когда буфер заполняется, он отбрасывает данные или, альтернативно, блокирует (вызывая дрожание).
Почему меняется эта строка с Serial.print (String (аналог)) на Serial.print(аналог) так много значит?
Это потому, что функция String () - это очень дорогая операция, которая отнимает много времени?И когда сценарию требуется больше времени для обработки каждой строки кода, сценарий затем имеет меньше времени для сбора достаточного количества точек данных аналогового чтения (A0)?
Да, да и да.
Одна из причин различия в производительности заключается в том, что String()
включает выделение и управление памятью в куче для хранения символов.
Serial.print(analog)
использует фиксированный размер буфера в стеке, так как код знает максимумколичество символов, необходимое для отображения целого числа.
И если я запусту ту же команду ffmpeg, используя все те же флаги, то ffmpeg попытается выполнить требование -ar 11111, ускорив воспроизведение звука?
Да.ffmpeg предполагает, что сэмплы имеют фиксированную частоту сэмплирования, но это не соответствует сэмплам, которые распечатываются.
Что означало бы, что моя частота дискретизации зависит от скорости выполнения моего сценария?
Да!
Что означает, что я долженучитывайте переменную скорость выполнения на других платах той же модели из-за различий в точности изготовления, температуре окружающей среды и т. д.? *
Да.Там будет множество переменных, которые влияют на скорость выполнения.
Что вы можете сделать?
Отделить выборку данных от выполнения кода.
Это можно сделать с помощьюреализация подпрограммы обработки прерываний .Свяжите ISR с аппаратным таймером, чтобы он выполнялся с фиксированной частотой дискретизации и избегал дрожания.
ISR может записывать в буфер, который код в loop()
передает по последовательному соединению.ISR и код последовательной передачи должны управлять буфером, чтобы ни один из них не был переполнен.Одним из способов сделать это является использование альтернативных буферов, которые используют ISR и код передачи.