如果您查看上面@Kevin Reid 发布的流程图,您可以看到它获取输入数据,减去 127,乘以 0.008,并将对转换为复数。
缺少的是确切的类型。它位于GNU Radio FAQ中。从那里我们了解到 uchar 是无符号字符(8 位),复杂数据类型是 python 中的“complex64”。
如果在 numpy 中完成,作为内存中的操作,它看起来像这样:
import numpy as np
import sys
(scriptName, inFileName, outFileName) = sys.argv;
ubytes = np.fromfile(inFileName, dtype='uint8', count=-1)
# we need an even number of bytes
# discard last byte if the count is odd
if len(ubytes)%2==1:
ubytes = ubytes[0:-1]
print "read "+str(len(ubytes))+" bytes from "+inFileName
# scale the unsigned byte data to become a float in the interval 0.0 to 1.0
ufloats = 0.008*(ubytes.astype(float)-127.0)
ufloats.shape = (len(ubytes)/2, 2)
# turn the pairs of floats into complex numbers, needed by gqrx and other gnuradio software
IQ_data = (ufloats[:,0]+1j*ufloats[:,1]).astype('complex64')
IQ_data.tofile(outFileName)
我已经测试了从 rtl_sdr 文件格式到 gqrx IQ 示例输入文件格式的转换,它似乎在内存中可以正常工作。
但请注意,此脚本仅适用于输入和输出文件都可以放入内存的数据。对于大于大约 1/5 系统内存的输入文件,sdr 记录很容易超过,最好一次读取一个字节。
我们可以通过循环读取数据 1 字节来避免内存占用,就像 gnu C 中的以下程序一样。这不是最干净的代码,我可能应该添加fclose
和检查ferror
,但它可以按原样工作爱好目的。
#include <complex.h>
#include <stdio.h>
#include <stdlib.h>
// rtlsdr-to-gqrx Copyright 2014 Paul Brewer KI6CQ
// License: CC BY-SA 3.0 or GNU GPL 3.0
// IQ file converter
// from rtl_sdr recording format -- interleaved unsigned char
// to gqrx/gnuradio .cfile playback format -- complex64
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);
}
}