Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何使用倍频程将波形的16位I/Q交错采样保存到二进制文件?_Matlab_Octave - Fatal编程技术网

Matlab 如何使用倍频程将波形的16位I/Q交错采样保存到二进制文件?

Matlab 如何使用倍频程将波形的16位I/Q交错采样保存到二进制文件?,matlab,octave,Matlab,Octave,我需要使用GNU倍频程或Matlab生成一个二进制文件,该文件中的数据是波形的16位交错I/Q数据(16位实部,16位虚部) 假设生成的文件名为“output.bin”,如果我们将位[0:15]读取为little endian,我们将得到第一个示例的“I”;位[16:31]是第一个样本的“Q” 第二个样本的位[32:47]->I 第二个样本的位[48:63]->Q 我所能找到的就是这样的东西: points = 1000; % Determines the frequency offset

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

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

第二个样本的位[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将已经是交错格式,因此您可以直接写入,但您可能需要此帮助程序例程:

对于R2017b和更早版本,在写入之前,您需要复制数据以获得交错格式的数据。例如,这将把real&imag数据转换成交错格式(作为一个实变量):

然后将数据写入输出文件。事实上,如果您不担心额外的数据拷贝,这种交错数据方法将在所有版本的MATLAB中都能工作

对于转换为16位浮点,一些选项包括:

半精度:使用MATLAB函数Half()将双精度转换为半精度(R2018b或更高版本)。

如果您有R2018a或更早版本,则必须手动转换为半精度。此处给出了执行此操作的C代码:

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

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

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

您认为输出文件是什么样子的?您是否正在寻找一种方法来保存
IQData
以备将来再次使用?或者您是否需要具有特定格式的输出文件?对于包含16位值的二进制文件,您需要知道文件读取器将使用哪个(大端或小端)。不清楚16位在代码中的位置,因为您显示的是64位双精度。您是否正在尝试写入某种类型的16位浮点值,如半精度或bfloat16?或者某种类型的缩放16位整数?请澄清。@TasosPapastylianou谢谢!我添加了一些关于我需要的文件的更多信息。我需要它以备将来再次使用。谢谢@Hoki!是小恩迪安。
u16 = typecast(single(Data),'uint16');
b16 = u16(1:2:end);