MATLAB:播放16位音频

时间:2014-06-18 14:32:15

标签: matlab 16-bit

我有一个矩阵(n,16),每个矩阵填充16位的音频样本。

所以矩阵看起来像:

  

[0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1; 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]

等等。我怎么能把它当作声音呢? sound()正在使用double个浮点(from -1 to 1 values)。如果我可以将它转换为这些值,我想它会起作用,但我不确定。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

@AnderBiguri几乎钉了它。拿你的数组,将它转换为有符号的双精度,规范化并播放它。

由于您有一个n x 16矩阵,其中每一行都是一个样本,每列都是该数字的位,首先我们需要将该矩阵转换为双精度格式。我们可以使用bin2dec来帮助我们做到这一点。但是,bin2dec会占用string。因此,我们可以将矩阵转换为字符串数组。我们假设inSound包含您之前指定的声音矩阵。

我还假设你的位是 Big-Endian 格式,所以最高位是最左边的位,跟在最右边的位。

根据您的评论,这些数字是恭维的。这意味着如果最高有效位为1,我们只需反转整个数字。因此,我们可以通过检查整个第一列来确定哪些行为负数,以查看是否存在10。我们找到带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会将01添加到此数字代码中,这样当我们将整个矩阵转换为字符串时,我们最终会得到字符串表示这些数字。

现在将二进制字符串转换为实际数字:

outSoundDec = bin2dec(inSoundString);

这将占用每一行并将其转换为十进制等效值。现在,如果您的位在 Little-Endian 中,您可以使用swapbytes翻转这些位,以便在继续之前将这些位转换为 Big-Endian 。现在我们已经转换了数字,我们需要否定那些应该是负数的行。

因此:

outSoundDec(checkSign) = -outSoundDec(checkSign);

现在我们需要对其进行规范化,以使范围介于-11之间。鉴于您已指定范围介于[-32768, 32767]之间,我们只需将所有数字除以32768。因此:

outSound = outSoundDec / 32768;

上面的代码现在会将您的信号规范化,使其从-1变为1。您可以使用sound(outSound, Fs);播放您的声音,其中Fs是您获取信号的采样频率。

祝你好运!