【发布时间】:2014-12-28 07:35:30
【问题描述】:
我正在从要解调的软件定义无线电读取 IQ 数据缓冲区。我收到的数据是 8 位无符号整数的缓冲区。我需要将其转换为缓冲区以输入复数浮点数以解调信号(我计划使用 Liquid DSP 库)。我在转换缓冲区时遇到了困难。
在 GNURadio 中,我已经制定了我的逻辑并将我的代码输出写入一个二进制文件,然后我可以将其用作测试的输入源。到目前为止,唯一可行的是将 uint8_t 缓冲区写入文件,对数据的其他操作会破坏逻辑。
这是我尝试过的 C++ 代码的 sn-p:
uint8_t buffer[buffersize];
uint8_t I;
uint8_t Q;
float Ifloat;
float Qfloat;
complex<float> complexsample;
ofstream myfile;
myfile.open("example.bin", ios::out | ios::app | ios::binary);
for (int x = 0; x < (buffersize/2); x++) {
memcpy(&I, buffer + (2 * x), 1);
memcpy(&Q, buffer + (1 + (2 * x)), 1);
//writing I and Q above to a binary file works
//myfile.write((char*) &I, sizeof(I));
//myfile.write((char*) &Q, sizeof(Q));
Ifloat = (float) I;
Qfloat = (float) Q;
//when I write Ifloat and Qfloat to a binary file then pass the
//file as an input source into the Add Const block things stop working
//myfile.write((char*) &IIfloat, sizeof(Ifloat));
//myfile.write((char*) &Qfloat, sizeof(Qfloat));
Ifloat -= 127.0;
Qfloat -= 127.0;
//what I would do to turn the turn the unsigned value into a signed value
//myfile.write((char*) &IIfloat, sizeof(Ifloat));
//myfile.write((char*) &Qfloat, sizeof(Qfloat));
complexsample.real(Ifloat);
complexsample.imag(Qfloat);
//what I would do to turn the I and Q floats into a single complex sample
//myfile.write((char*) &complexsample, sizeof(complexsample));
}
【问题讨论】:
-
你确定这段代码是你实际写的吗?因为如果
I的类型为uint8_t而不是uint8_t [4]或uint8_t *,我认为memcpy(I, buffer + (2 * x), 1);没有多大意义。此外,通常浮点数是 4 个字节,而不是您在代码中不同程度假设的 2 个字节或 1 个字节。 -
至少应该是
memcpy(&I, buffer + (2 * x), 1);或简单的I = buffer[2 * x]。 -
我的代码中实际上有 memcpy(&I, buffer + (2 * x), 1),当我简化它以进行发布时,这是我的帖子中的错字。在我正在运行的代码中,我从一个 tcp 套接字接收,所以我只是为了简化而删除了该部分。
-
我可能误解了,所以你实际上有
uint8_t0-255 的值,你真的只是希望它们作为浮点数? -
@jprince14 Liquid-dsp 或 gnuradio 或您插入的任何东西所期望的字节序是什么?
标签: c++ signals signal-processing gnuradio