首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Octave将波形的16位I/Q交错采样保存为二进制文件?

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

Stack Overflow用户
提问于 2021-01-29 08:00:12
回答 1查看 320关注 1票数 0

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

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

第二个样本的位32:47 -> i

第二个样本的位48:63 -> Q

。。。。。。

我能找到的东西是这样的:

代码语言:javascript
运行
复制
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的新手,真的搞不懂。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 01:58:20

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

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

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

代码语言:javascript
运行
复制
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位写入。例如,类似于

代码语言:javascript
运行
复制
u16 = typecast(single(Data),'uint16');
b16 = u16(1:2:end);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65946989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档