сигналы — преобразование буфера uint8_t в сложный буфер с плавающей точкой в ​​переполнении стека

Я читаю в буфере данных IQ от Программно-определяемой радиостанции, которую хочу демодулировать. Данные, которые я получаю, представляют собой буфер из 8-битных целых чисел без знака. Мне нужно преобразовать это в буфер, чтобы набрать сложное значение типа float для демодуляции сигнала (я планирую использовать Liquid DSP Library). У меня трудности с конвертацией буфера.

В GNURadio я разработал свою логику и записываю вывод своего кода в двоичный файл, который затем я могу использовать в качестве входного источника для тестирования. Пока единственное, что работает, — это запись в файл буфера uint8_t, другие манипуляции с данными нарушают логику.

Блок-схема GNURadio

Вот фрагмент кода C ++, который я пробовал:

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));
}

1

Решение

DrPaulBrewer написал простую программу для точного преобразования, которое я искал. Ссылка на его GitHub https://gist.github.com/DrPaulBrewer/917f990cc0a51f7febb5

Его исходный код:

void main(int argc, char *argv[])
{
int byte1, byte2; // int -- not unsigned char -- see fgetc man page
float _Complex fc;
const size_t fc_size = sizeof(fc);
FILE *infile,*outfile;
const float scale = 1.0/128.0;
const char *infilename = argv[1];
const char *outfilename = argv[2];
if (argc<3){
printf("usage: rtlsdr-to-gqrx infile outfile\n");
exit(1);
}
// printf("in= %s out= %s \n", infilename, outfilename);
infile=fopen(infilename,"rb");
outfile=fopen(outfilename,"wb");
if ((infile==NULL) || (outfile==NULL)){
printf("Error opening files\n");
exit(1);
}
while ((byte1=fgetc(infile)) != EOF){
if ((byte2=fgetc(infile)) == EOF){
exit(0);
}
fc = scale*(byte1-127) + I*scale*(byte2-127);
fwrite(&fc,fc_size,1,outfile);
}
}
0

Другие решения


По вопросам рекламы [email protected]