У вас какая-то путаница.
Msb first и биг эндиан это разные вещи. Первое определяет порядок бит, а второе байт в слове.
А что до значащих данных, тут вообще ерунда. Биг эндиан означает, что старшие байты СЛЕВА. А вот какие из них значащие - зависит от формата.
Лучше так:
Изначально ваши данные 32 битные
0xAABBCCDD
После сдвига вправо
0x00AABBCC
и после переформатирования в int16
0xBBCC
Вы уверены, что потеря старшего байта 0xAA - это то что вы хотите?
1 лайк
Большое спасибо! Изучу информацию
а на пк можете поиграться с этим значением ? увеличить или уменьшить его, ну или в коде…
это параметр отвечает за скорость воспроизведения, попробуйте увеличить и уменьшить на 2
вариант номер 2
Неправильная обработка разрядности данных (24 бита vs 32 бита). INMP441 — 24-битный микрофон, но его данные передаются внутри 32-битных
void loop1(){
while (true){
i2s.read(samples32, sizeof(samples32)); // Читаем 32-битные данные
if (canWrite == true) {
for (int i = 0; i < SAMPLES; i++) {
// ИЗМЕНЕНИЕ ЗДЕСЬ: Берем старшие 16 бит из 24-битного сэмпла
// Сдвиг на 16 бит сохраняет полезный сигнал и убирает шум из младших битов
samples16[i] = (int16_t)(samples32[i] >> 16);
} canWrite = false; }
}
}
у меня было 16кГц, поменял на 44.1 и ничего не изменилось
Проблема была в другом, уже разобрался, спасибо!
Спасибо за уделённое время! Это заработало!
Напиши в чём и какое было решение.