В чем разница между double и int16 при использовании аудиоплеера в matlab

У меня вектор хранит аудиоданные, с частотой 48к. Данные состоят из целых чисел, максимальное значение составляет около 4k. Тип вектора <1x768000 double>. Когда я собираю свой плеер с этим типом вектора, как показано ниже:

a1 = audioplayer(A,48000);
a1.play();

результирующий звук очень шумный, например, значение SNR меньше 1(что означает, что уровень шума выше, чем то, что я хочу услышать).

Однако, когда я приведу данные к int16 и воспроизведу звук, как показано ниже:

a2 = audioplayer(int16(A),48000);
a2.play();

Результирующий звук очень плавный, а SNR примерно 7-8 или что-то в этом роде (не измерено и не рассчитано, шум едва различим, но есть уверенность.)

Итак, вот еще раз мой вопрос: в чем разница между double и int16 при использовании аудиоплеера в matlab?

PS: я могу предоставить, если вы хотите.

PS2: A, как обычно, содержит речь и немного шума (не особого типа, вероятно, из-за плохого микрофона и т. Д.).

1 ответ

Решение

Нашел ответ по API. Согласно API для аудиоплеера принимает значения от -1 до 1, когда ввод имеет двойной тип. Когда я впервые использую его в двойном типе, он не масштабирует значения между -1 и 1, просто пытается воспроизвести их. Вместо того, чтобы использовать исходные значения A, масштабирование перед игрой решает проблему.

a3 = audioplayer(A*/max(abs(A)),48000);
a3.play();

масштабирует вектор правильно. это так же хорошо, как

a2 = audioplayer(int16(A),48000);
a2.play();
Другие вопросы по тегам