MATLAB从二进制文件逐位读取

MATLAB从二进制文件逐位读取,matlab,wav,binary-data,bits,Matlab,Wav,Binary Data,Bits,我能够使用以下代码成功读取.wav文件 [y,Fs,nbits,opts] = wavread('MyFile.wav','native') 因此,我现在从文件中知道存储在y中的数据,采样率(Fs),nbits,它是16,'native'通知我数据是uint16类型 现在我想一点一点地读取数据值。我已经知道的每个数据值都由16位组成 是否有一种方法可以逐位读取一个数据值。因此,对于uint16数据值,我希望读取位0和位1-15。然后我希望读取位0给我一个值,位1-15给我一个值。这可能吗 我知

我能够使用以下代码成功读取.wav文件

[y,Fs,nbits,opts] = wavread('MyFile.wav','native')
因此,我现在从文件中知道存储在
y
中的数据,
采样率(Fs)
nbits
,它是
16
'native'
通知我数据是
uint16
类型

现在我想一点一点地读取数据值。我已经知道的每个数据值都由16位组成

是否有一种方法可以逐位读取一个数据值。因此,对于
uint16
数据值,我希望读取
位0
位1-15
。然后我希望读取位0给我一个值,位1-15给我一个值。这可能吗


我知道fread,但我只知道在逐字节阅读时如何使用它。

当你能够回答自己的问题时,它总是很好的。以下是我发现我可以做的:

[y,Fs,nbits,opts] = wavread('MyFile.wav','native')

Sample = y(1:10,1); %Takes 10 data values
                    %I know I have uint16 data type

%I then take a bit at a time from the data value

Bit_16 = bitget(Sample(:,1),16);
Bit_15 = bitget(Sample(:,1),15);
Bit_14 = bitget(Sample(:,1),14);
and so on . . . 

%I could then produce a matrix from the individual bit values

Matr = [Bit_16,Bit_15,Bit_14,...,];

%Each row of the matrix is now the desired binary number
%Next steps, convert to string and then to a decimal number

Str = num2str(Matr);
15-bit value = bin2dec(Str); 

然后,您可以只需1位就可以执行上述操作。当您能够回答自己的问题时,这总是很好的。以下是我发现我可以做的:

[y,Fs,nbits,opts] = wavread('MyFile.wav','native')

Sample = y(1:10,1); %Takes 10 data values
                    %I know I have uint16 data type

%I then take a bit at a time from the data value

Bit_16 = bitget(Sample(:,1),16);
Bit_15 = bitget(Sample(:,1),15);
Bit_14 = bitget(Sample(:,1),14);
and so on . . . 

%I could then produce a matrix from the individual bit values

Matr = [Bit_16,Bit_15,Bit_14,...,];

%Each row of the matrix is now the desired binary number
%Next steps, convert to string and then to a decimal number

Str = num2str(Matr);
15-bit value = bin2dec(Str); 

然后,只需1位即可执行上述操作。请查看
bitget
似乎很有用,或者
bitand
和移位操作。取决于您对结果数据的处理方式/解释方式。大多数CPU以字节为单位寻址内存,这使得字节成为可分配的最小内存单元。在c/c++中,可以为结构中的特定信息分配单个位,但该结构仍然要求其总内存为字节的倍数。据我所知,Matlab无法做到这一点。尝试使用逐位运算来查找第一位。对于记录,尝试使用“最低有效位”(LSB)或“最高有效位”(MSB)的符号,而不是第一位或最后一位。这将消除讨论bits时对endianness的依赖性。我已经对我所追求的东西做了粗略的修改。我只需要尝试一些想法。我将在适当的时候发布一个答案。我很感谢上面的评论。请看下面我的回答:)看看
bitget
似乎很有用,或者
bitand
和移位操作。取决于您对结果数据的处理方式/解释方式。大多数CPU以字节为单位寻址内存,这使得字节成为可分配的最小内存单元。在c/c++中,可以为结构中的特定信息分配单个位,但该结构仍然要求其总内存为字节的倍数。据我所知,Matlab无法做到这一点。尝试使用逐位运算来查找第一位。对于记录,尝试使用“最低有效位”(LSB)或“最高有效位”(MSB)的符号,而不是第一位或最后一位。这将消除讨论bits时对endianness的依赖性。我已经对我所追求的东西做了粗略的修改。我只需要尝试一些想法。我将在适当的时候发布一个答案。我非常感谢以上的评论。请看下面我的答案:)答案可能会通过添加一些函数或循环来改进,但我不确定如何做到这一点,因此欢迎对代码进行任何编辑以提高代码的效率:)答案可能会通过添加一些函数或循环来改进,但我不确定如何做到这一点,因此欢迎对代码进行任何编辑以提高代码的效率:)