2

我尝试打开将 .bin 文件(通过 RTL-SDR 捕获的数据)转换为 .cfile 进行分析的流程图。我从链接http://sdr.osmocom.org/trac/attachment/wiki/rtl-sd下载了文件...

但是,我无法让它在 GRC 3.7.2.1 上运行。当我尝试打开文件时,我收到一长串错误消息(如下所示)。

我正在使用 Ubuntu v14.04.1。

我将非常感谢任何帮助解决此问题或将 .bin 文件转换为 .cfile 的任何替代方法(python 源代码?)

=======================================================
 <<< Welcome to GNU Radio Companion 3.7.2.1 >>>

Showing: ""

Loading: "/home/zorro/Downloads/rtl2832-cfile.grc"
Error:
/home/zorro/Downloads/rtl2832-cfile.grc:2:0:ERROR:VALID:DTD_UNKNOWN_ELEM:
No declaration for element html
/home/zorro/Downloads/rtl2832-cfile.grc:2:0:ERROR:VALID:DTD_UNKNOWN_ATTRIBUTE:
No declaration for attribute xmlns of element html
/home/zorro/Downloads/rtl2832-cfile.grc:9:0:ERROR:VALID:DTD_UNKNOWN_ELEM:
No declaration for element head
/home/zorro/Downloads/rtl2832-cfile.grc:10:0:ERROR:VALID:DTD_UNKNOWN_ELEM:
4

2 回答 2

4

您看到的错误的原因是您的链接错误 - 它被截断并指向 HTML 页面,而不是 GRC 文件。错误来自 GRC 试图将 HTML 解释为 GRC XML。正确的下载链接是:http ://sdr.osmocom.org/trac/raw-attachment/wiki/rtl-sdr/rtl2832-cfile.grc

但是,请注意,该流程图是为 GNU Radio 3.6 构建的,由于许多块在内部重命名,因此在 GNU Radio 3.7 中不起作用。我建议使用提供的图片从头开始重建它。

由于此流程图中没有变量,您可以简单地拖出块并设置参数,如图所示。这样做对于熟悉 GNU Radio Companion 用户界面也是一个很好的练习。

于 2014-09-04T01:25:52.707 回答
1

如果您查看上面@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);
  } 
}
于 2014-10-14T08:29:45.023 回答