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

How to save 16-Bit I/Q interleaved samples of a waveform to binary file using Octave?

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

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

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

位[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 写入二进制文件。