python GNU Radio中无线电发射机的间隔开启

cl25kdpy  于 2023-04-28  发布在  Python
关注(0)|答案(1)|浏览(118)

我用的是发射器HackRF 1。我需要每分钟发送一次同样的信息。剩下的时间我需要把发射器关掉。在传输开始时,消息从一开始就被播放。为此,我使用了给Marcus Müller的代码。现在我有以下图表:

但是当使用我的模块时,我得到一个带有一些点击的输出信号,当使用谐波信号作为信号源时,这是明显可见的。

31moq8wy

31moq8wy1#

短时长方式

一般来说,您可以使用开箱即用的“模式交织器”块来解决这个问题,其中您将文件源连接到一个输入,将空源连接到另一个输入,然后从第一个输入转发一个音频文件长度的块,然后从另一个(空)输入转发一个小时减去该长度。

[ 0 0 0 … 0 0 1 1 … … … … … … 1 ]
  ^         ^ ^               ^
   \       /   \             /
    audio       remainder  of
    length       a full  hour

只是在这里,时间段变得太长,因此交织器模式向量变得不可行来管理(其大小需要为1小时的样本,这在44处是不可行的)。1 kHz采样率,大于605 MB的整数,以选择从哪个输入转发)。
另一个问题是,你需要知道你的音频文件中有多少样本来创建交织器模式。

解决方案:编写自己的有限状态机

所以,这里的解决方案是编写你自己的块,它有两个状态:
1.通过音频文件输入
1.产生零(并且不传递任何输入样本)
其中,当您看到完整的音频文件已经通过时,从状态1切换到状态2,并且当您看到整整一个小时已经过去时,从状态2切换到状态1。
如果你写一个嵌入的python块,这真的很容易!
工作函数的伪代码,该函数将是

import numpy as np
from gnuradio import gr

class yourblock(gr.basic_block):
    def __init__(self, period=60, input_length=708000, rate=44100):
       gr.basic_block.__init__(self, 
       name = "My block",
       in_sig = [np.float32],
       out_sig = [np.float32]
       )
       self._samples_per_cycle = int(period * rate)
       self._zeros_left = self._samples_per_cycle - input_length
       self._input_length = input_length
       self._input_left = input_length
       self._state = 0

def general_work(self, input_items, output_items):
       in_ = input_items[0]
       out_ = output_items[0]
       if self._state == 0: # Passing through from input
         to_copy = min(self._input_left, len(in_), len(out_))
         out_[0:to_copy] = in_[0:to_copy]
         self._input_left -= to_copy
         if(self._input_left == 0):
           self._state = 1
           self._zeros_left = self._samples_per_cycle - self._input_length
         self.consume_each(to_copy) # copied this much from input
         return to_copy             # wrote this much to output
       if self._state == 1:
         to_zero = min(self._zeros_left, len(in_), len(out_))
         out_[0:to_zero] = 0.0
         self._zeros_left -= to_zero
         if(self._zeros_left == 0):
           self._state = 0
           self._input_left = self._input_length
         self.consume_each(to_zero) # copied this much from input
         return to_zero             # wrote this much to output

相关问题