Floating point 在gnuradio中从浮点转换为字符时出错
我正在尝试捕获GPS信号,并将它们与我的USRP E100和GNU Radio Companion实现的以下流程图一起保存到.bin文件中: 正如你所看到的,我从GPS频率中接收了50米的复样本,然后取它们的实部和虚部。然后,我进行浮点到字符的转换,并将其保存为IQ(…)bin文件。如果没有浮点到字符的转换,则一切正常,但如果有,则输出文件仅填充0(例如,浮点输出“b502 323a b502 32b8 b502 b239 1d12 0b3a”转换为字符输出“0000”) 我不知道这里发生了什么,因为如果使用Float-to-Char块,就会出现错误。我还尝试使用其他类型的转换器,如Float-to-Short,我得到了相同的输出:0的向量 生成流程图时产生的代码如下所示:Floating point 在gnuradio中从浮点转换为字符时出错,floating-point,gnuradio,usrp,gnuradio-companion,Floating Point,Gnuradio,Usrp,Gnuradio Companion,我正在尝试捕获GPS信号,并将它们与我的USRP E100和GNU Radio Companion实现的以下流程图一起保存到.bin文件中: 正如你所看到的,我从GPS频率中接收了50米的复样本,然后取它们的实部和虚部。然后,我进行浮点到字符的转换,并将其保存为IQ(…)bin文件。如果没有浮点到字符的转换,则一切正常,但如果有,则输出文件仅填充0(例如,浮点输出“b502 323a b502 32b8 b502 b239 1d12 0b3a”转换为字符输出“0000”) 我不知道这里发生了什
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: Gps Datagrabber
# Generated: Wed Feb 3 10:01:35 2016
##################################################
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from gnuradio.gr import firdes
from optparse import OptionParser
class GPS_datagrabber(gr.top_block):
def __init__(self):
gr.top_block.__init__(self, "Gps Datagrabber")
##################################################
# Variables
##################################################
self.samp_rate = samp_rate = 5*1000000
self.Tiempo_sec = Tiempo_sec = 10
self.gain = gain = 15
self.center_freq = center_freq = int(1.57542e9)
self.band = band = int(40e6)
self.Samples = Samples = Tiempo_sec*samp_rate
##################################################
# Blocks
##################################################
self.gr_interleave_0 = gr.interleave(gr.sizeof_char*1)
self.gr_head_0 = gr.head(gr.sizeof_gr_complex*1, 50000000)
self.gr_float_to_char_1 = gr.float_to_char()
self.gr_float_to_char_0 = gr.float_to_char()
self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "/home/root/Desktop/USRP_E100")
self.gr_file_sink_0.set_unbuffered(True)
self.gr_complex_to_real_0 = gr.complex_to_real(1)
self.gr_complex_to_imag_0 = gr.complex_to_imag(1)
self.USRP_sync_123 = uhd.usrp_source(
device_addr="addr0=192.168.10.1",
stream_args=uhd.stream_args(
cpu_format="fc32",
channels=range(1),
),
)
self.USRP_sync_123.set_clock_source("external", 0)
self.USRP_sync_123.set_time_source("external", 0)
self.USRP_sync_123.set_samp_rate(samp_rate)
self.USRP_sync_123.set_center_freq(center_freq, 0)
self.USRP_sync_123.set_gain(gain, 0)
self.USRP_sync_123.set_antenna("TX/RX", 0)
self.USRP_sync_123.set_bandwidth(band, 0)
##################################################
# Connections
##################################################
self.connect((self.USRP_sync_123, 0), (self.gr_head_0, 0))
self.connect((self.gr_head_0, 0), (self.gr_complex_to_real_0, 0))
self.connect((self.gr_interleave_0, 0), (self.gr_file_sink_0, 0))
self.connect((self.gr_complex_to_real_0, 0), (self.gr_float_to_char_0, 0))
self.connect((self.gr_float_to_char_0, 0), (self.gr_interleave_0, 0))
self.connect((self.gr_complex_to_imag_0, 0), (self.gr_float_to_char_1, 0))
self.connect((self.gr_float_to_char_1, 0), (self.gr_interleave_0, 1))
self.connect((self.gr_head_0, 0), (self.gr_complex_to_imag_0, 0))
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.set_Samples(self.Tiempo_sec*self.samp_rate)
self.USRP_sync_123.set_samp_rate(self.samp_rate)
def get_Tiempo_sec(self):
return self.Tiempo_sec
def set_Tiempo_sec(self, Tiempo_sec):
self.Tiempo_sec = Tiempo_sec
self.set_Samples(self.Tiempo_sec*self.samp_rate)
def get_gain(self):
return self.gain
def set_gain(self, gain):
self.gain = gain
self.USRP_sync_123.set_gain(self.gain, 0)
self.USRP_sync_123.set_gain(self.gain, 1)
self.USRP_sync_123.set_gain(self.gain, 2)
def get_center_freq(self):
return self.center_freq
def set_center_freq(self, center_freq):
self.center_freq = center_freq
self.USRP_sync_123.set_center_freq(self.center_freq, 0)
self.USRP_sync_123.set_center_freq(self.center_freq, 1)
self.USRP_sync_123.set_center_freq(self.center_freq, 2)
def get_band(self):
return self.band
def set_band(self, band):
self.band = band
self.USRP_sync_123.set_bandwidth(self.band, 0)
self.USRP_sync_123.set_bandwidth(self.band, 1)
self.USRP_sync_123.set_bandwidth(self.band, 2)
def get_Samples(self):
return self.Samples
def set_Samples(self, Samples):
self.Samples = Samples
if __name__ == '__main__':
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
(options, args) = parser.parse_args()
tb = GPS_datagrabber()
tb.run()
错误在哪里?可能是USRP/硬件问题?或者可能我无法将浮点数据转换为字符数据?当以复数操作时,USRP默认在[-1,1]范围内缩放每个IQ样本 但是,我认为输入信号可能非常弱,因此每个IQ样本值应低于[-0.5,0.5]。
Float to Char
块执行从Float到Char的转换。但是,将浮点值转换为[-0.5,0.5]范围内的整数应该始终产生零。这就是为什么您的文件只包含零
为了避免这个问题,有两种可能的解决方案:
解决方案1:
适当缩放输入IQ样本,使其范围超过[-0.5,0.5]范围。这可以通过将信号乘以常数或正确地将Float to Char
块的Scale
参数更改来实现
解决方案2:
由于您对8位样本精度感兴趣,我建议指示USRP以有符号短(16位)格式在流程图上传递样本。每个IQ样本的范围为[-2^15,2^15]。然后只需执行
Short-to-Char
转换,但要确保每个样本的振幅不大于2^7,否则将获得剪切效果。使用此解决方案,流程图中流动的数据要少得多,因为每个IQ样本的大小只有复杂表单的一半。此外,integer羽绒服速度更快。嗨,马诺斯,首先,感谢您的回答。我正在应用你在上面公开的第一个解决方案,在将浮点转换为字符之前,似乎已经得到了一个非零向量。但我不相信我在做什么,不是因为你的答案不对,只是因为我必须将它乘以1e4-1e5之间的标量才能得到一些东西。所以,我不知道如何得到正确的标量,因为如果标量太大,可能我会得到你之前告诉我的削片效果。@vinsantyl你的信号振幅很小。增加信号幅度的最佳方法是增加SDR设备的模拟增益,这样您就可以更多地利用ADC的动态范围。所以你从这里开始。然后,如果这还不够,你可以用一个合适的常数乘以软件增益。对于这个常数没有指导原则,只是为了满足您的计划。谢谢您的帮助。看来我开始有了一些成果。谢谢!