MATLAB 从二进制文件中逐位读取
MATLAB reading bit by bit from a binary file
我可以使用以下代码成功读取 .wav 文件。
[y,Fs,nbits,opts] = wavread('MyFile.wav','native')
所以我现在从文件中知道存储在 y
中的数据,sample rate (Fs)
,nbits
即 16
和 'native'
通知我的数据是 uint16
类型。
现在我想逐位读取一个数据值。我已经知道的每个数据值都是由 16 位组成的。
有没有办法一点一点读取一个数据值。因此,对于 uint16
数据值,我想读取 bit 0
和 bits 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 位执行上述相同操作
你不需要三行来做你正在做的事情,因为 bitget 接受一个位位置数组来获取并给你一个位数组作为输出。
Bit(14:16) = bitget(Sample(:,1),14:16);
或者对于第 14 位,将您的值移到最右边并用二进制 1
屏蔽它
bitshift(Sample(:,1),-14)
bitand(Sample(:,1),1)
我可以使用以下代码成功读取 .wav 文件。
[y,Fs,nbits,opts] = wavread('MyFile.wav','native')
所以我现在从文件中知道存储在 y
中的数据,sample rate (Fs)
,nbits
即 16
和 'native'
通知我的数据是 uint16
类型。
现在我想逐位读取一个数据值。我已经知道的每个数据值都是由 16 位组成的。
有没有办法一点一点读取一个数据值。因此,对于 uint16
数据值,我想读取 bit 0
和 bits 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 位执行上述相同操作
你不需要三行来做你正在做的事情,因为 bitget 接受一个位位置数组来获取并给你一个位数组作为输出。
Bit(14:16) = bitget(Sample(:,1),14:16);
或者对于第 14 位,将您的值移到最右边并用二进制 1
屏蔽它bitshift(Sample(:,1),-14)
bitand(Sample(:,1),1)