微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Octave 将波形的 16 位 I/Q 交错样本保存到二进制文件?

如何解决如何使用 Octave 将波形的 16 位 I/Q 交错样本保存到二进制文件?

我需要使用 GNU Octave 或 Matlab 生成一个二进制文件,该文件中的数据是波形的 16 位交错 I/Q 数据(16 位实部,16 位虚部)。

假设生成文件名为“output.bin”,如果我们将 bit [0:15] 读为小端,我们将得到第一个样本的“I”; bit[16:31] 是第一个样本的“Q”;

bit[32:47] -> 第二个样本的 I

bit[48:63] -> 第二个样本的 Q

。 . . . . .

我所能找到的就是这样的:

points = 1000;

% Determines the frequency offset from the carrier
cycles = 101;
phaseInc = 2*pi*cycles/points;
phase = phaseInc * (0:points-1);

% Create an IQ waveform
Iwave = cos(phase);
Qwave = sin(phase);
IQData = Iwave+1i*Qwave;
IQData = IQData(:)';

save -binary output.bin IQData

。 . . . . .

但显然我从中得到的不是 16 位交错 I/Q 数据。

我是 Octave/Matlab 的新手,真的想不通。

非常感谢!

解决方法

在 MATLAB 中,请参阅 fopen( ) 和 fwrite( ) 以写出二进制文件。对于 R2018a 及更高版本,您的 IQData 已经采用交错格式,因此您可以直接编写,但您可能需要此辅助例程:

https://www.mathworks.com/matlabcentral/fileexchange/77530-freadcomplex-and-fwritecomplex

对于 R2017b 及更早版本,您需要在进行写入之前复制数据以使其采用交错格式。例如,这会将真实和图像数据转换为交错格式(作为真实变量):

Data = [Iwave;Qwave];

然后将数据写入输出文件。事实上,如果您不担心额外的数据副本,这种交错数据方法将适用于所有版本的 MATLAB。

要转换为 16 位浮点数,一些选项是:

半精度:使用 MATLAB 函数 half( ) 将双精度转换为半精度(R2018b 或更高版本)。 https://www.mathworks.com/help/fixedpoint/ref/half.html

如果您有 R2018a 或更早版本,则必须手动转换为半精度。此处给出了执行此操作的 C 代码: https://www.mathworks.com/matlabcentral/fileexchange/23173-ieee-754r-half-precision-floating-point-converter

bfloat16:目前还没有官方的 MATLAB 支持。让您接近的一个简单的截断方法(即,没有舍入到偶数和没有 NaN 检查)将转换为单精度,然后选择最重要的 16 位进行写入。例如,类似

u16 = typecast(single(Data),'uint16');
b16 = u16(1:2:end);

然后将 b16 写入您的二进制文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。