我使用录制了一个声波(16 位单声道)audiorecorder
,我需要在不MATLAB
使用内置工具箱以外的工具箱的情况下将其量化为 15 位(去除 LSB)。有人可以帮忙吗?
fs = 8000;
tmax = 2;
nbits = 16;
nchan = 1;
Recorder = audiorecorder(fs, nbits, nchan);
record(Recorder);
pause(tmax);
stop(Recorder);
我使用录制了一个声波(16 位单声道)audiorecorder
,我需要在不MATLAB
使用内置工具箱以外的工具箱的情况下将其量化为 15 位(去除 LSB)。有人可以帮忙吗?
fs = 8000;
tmax = 2;
nbits = 16;
nchan = 1;
Recorder = audiorecorder(fs, nbits, nchan);
record(Recorder);
pause(tmax);
stop(Recorder);
好的,既然您承认这是一个家庭作业问题并且要求一种方法而不是解决方案,那么首先,您需要信号值
x = Recorder.getaudiodata('int16');
由于您要进行量化,因此最好从正确范围内的值开始,而不是标准化的双精度 [-1, 1]
所以,接下来你需要从 16 位量化到 15 位。这在 matlab 中实际上很容易,如果你正在编写大量代码,它可能无法正常工作。有几种方法可以做到。
本质上,当您删除 1 位时,您会丢弃一半的信息。
取具有 2 位精度的数字 0、1、2、3。在二进制中,00、01、10、11。如果我量化为一位,我会丢弃一半的信息。想象一下 LSB 消失了,我会有 0、0、1、1。但是,我的原始数字跨度为 0 到 3... 通常您希望您的数字具有相同的动态范围。所以,我把一半的数字扔掉了,如果我将新数字按 2 缩放呢?我得到 0、0、2、2。这是从 2 位到 1 位的正确量化。
在您的问题中,如果所有奇数都是偶数会发生什么?
您可以在 MATLAB 中使用 bitshift 函数。我相信
Recorder = audiorecorder(fs, nbits, nchan);
data = getaudiodata(Recorder, 'int16');
outData = bitshift(data, -1);
希望这可以帮助。
迪内什