@AnderBiguri几乎钉了它。拿你的数组,将它转换为有符号的双精度,规范化并播放它。
由于您有一个n x 16
矩阵,其中每一行都是一个样本,每列都是该数字的位,首先我们需要将该矩阵转换为双精度格式。我们可以使用bin2dec
来帮助我们做到这一点。但是,bin2dec
会占用string
。因此,我们可以将矩阵转换为字符串数组。我们假设inSound
包含您之前指定的声音矩阵。
我还假设你的位是 Big-Endian 格式,所以最高位是最左边的位,跟在最右边的位。
根据您的评论,这些数字是恭维的。这意味着如果最高有效位为1,我们只需反转整个数字。因此,我们可以通过检查整个第一列来确定哪些行为负数,以查看是否存在1
或0
。我们找到带1
的行,只需取1
并减去数组中的每个元素。就这样:
checkSign = inSound(:,1) == 1;
inSound(checkSign,:) = 1 - inSound(checkSign,1);
因此,当我们将数字转换为十进制时,我们只是再次找到那些应为负数的行并简单地否定它们。让我们首先转换我们的数字。
inSoundString = char(inSound + '0');
假设char
的输入是 ASCII 代码, char
会将矩阵或向量中的每个数字转换为字符串表示形式。因此,当我们添加0
时,我们会在inSound
中添加每个数字,其中的数字ASCII代码代表0
在ASCII中的含义。这是我们开始的基准。在此之后,inSound
会将0
或1
添加到此数字代码中,这样当我们将整个矩阵转换为字符串时,我们最终会得到字符串表示这些数字。
现在将二进制字符串转换为实际数字:
outSoundDec = bin2dec(inSoundString);
这将占用每一行并将其转换为十进制等效值。现在,如果您的位在 Little-Endian 中,您可以使用swapbytes
翻转这些位,以便在继续之前将这些位转换为 Big-Endian 。现在我们已经转换了数字,我们需要否定那些应该是负数的行。
因此:
outSoundDec(checkSign) = -outSoundDec(checkSign);
现在我们需要对其进行规范化,以使范围介于-1
到1
之间。鉴于您已指定范围介于[-32768, 32767]
之间,我们只需将所有数字除以32768
。因此:
outSound = outSoundDec / 32768;
上面的代码现在会将您的信号规范化,使其从-1
变为1
。您可以使用sound(outSound, Fs);
播放您的声音,其中Fs
是您获取信号的采样频率。
祝你好运!