c++ - 使用 gnuradio lib 进行数字信号抽取

标签 c++ signal-processing gnuradio

我编写的应用程序必须在其中处理数字信号 - double 组。我必须对信号进行抽取、过滤等。我找到了一个 gnuradio 项目,其中包含针对此问题的函数。但我不知道如何正确使用它们。

我需要信号抽取(例如从 250Hz 到 200Hz)。该函数应该类似于 Matlab 中的 resample 函数。我发现,它的类是:

  • rational_resampler_base_fff 类 source
  • fir_filter_fff 类 source
  • ...

不幸的是,我不知道如何使用它们。

我安装的gnuradio和共享库

谢谢你的建议

编辑@jcoppens

非常感谢您的帮助。 但是我必须在我的代码中处理信号。我在 gnuradio 中找到了可以解决我的问题的类,但我需要有关如何设置它们的帮助。

我必须设置的功能是:
低通(双倍增益、双倍采样频率、双倍截止频率、双倍过渡宽度、窗口、β)
其中:

use "window method" to design a low-pass FIR filter
gain: overall gain of filter (typically 1.0)
sampling_freq: sampling freq (Hz)
cutoff_freq: center of transition band (Hz)
transition_width: width of transition band (Hz).
The normalized width of the transition band is what sets the number of taps required. Narrow –> more taps
window_type: What kind of window to use. Determines maximum attenuation and passband ripple.
beta: parameter for Kaiser window

我知道,我必须使用 window = KAISER 和 beta = 5,但对于其余部分我不确定。

我使用的函数是:low_passpfb_arb_resampler_fff::filter

更新:

我使用 libsamplerate 解决了重采样问题

最佳答案

I need signal decimate (for example from 250Hz to 200Hz)

警告:我错误地表达了最初的介绍性段落 - 我很抱歉。

由于 250 Hz 与 200 Hz 没有直接关系,因此您必须采取一些技巧才能将 250Hz 转换为 200Hz。在 250Hz 样本之间插入 4 个内插样本,将频率降低到 50Hz。然后,您可以通过 4 倍抽取将频率再次提高到 200Hz。

为此,您需要“Rational Resampler”,您可以在其中定义子样本和抽取因子。像这样:

enter image description here

这意味着如果您使用该库,则必须执行类似的操作。也许没有图书馆就更简单了。在 250 Hz 样本之间进行线性插值(即在每个样本之间插入 4 个额外样本),然后通过选择每个第 4 个样本进行抽取。

注意:在 stackexchange 上有一个信号处理论坛 - 也许这个问题可能属于那个类别......

更多信息:如果您只需要对输入数据进行重采样,而不需要实际的 gnuradio 程序,那么请查看此文档:

https://ccrma.stanford.edu/~jos/resample/resample.pdf

有几个指向其他文档的链接,以及指向 libresamplelibresample4 和其他文档的链接,这些链接可能对您有用。另一个非常有趣的页面是:

http://www.dspguru.com/dsp/faqs/multirate/resampling

最后,从与上述 pdf 相同的来源,检查他们的 snd 程序。它可以在不编写任何 软件的情况下解决您的问题。它可以加载浮点样本、重新采样并再次保存:

http://ccrma.stanford.edu/planetccrma/software/soundapps.html#SECTION00062100000000000000

编辑:还有另一种解决方案——也许是最简单的解决方案:使用 Matlab(或免费的 Octave 版本):

pkg load signal
t = linspace(0, 10*pi, 50);  % Generate a timeline - 5 cycles
s = sin(t);                  % and the sines -> 250 Hz
tr = resample(s, 5, 4);      % Convert to 200 Hz
plot(t, s, 'r')              % Plot 250 Hz in red
hold on
plot(t, tr(1:50))            % and resampled in blue

会给你:

enter image description here

关于c++ - 使用 gnuradio lib 进行数字信号抽取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960223/

相关文章:

linux - GNU Radio 和野生动物追踪

keyboard - GNU Radio 中的 GFSK 解调

c++ - 一个函数可以使用点运算符调用另一个函数吗

c++ - 模板模板参数参数名称用法

c - 使用 FFT 代替卷积实现的低通滤波器

c++ - Gnuradio C++ block : high CPU

python-2.7 - 执行Python代码时出现属性错误

boost - 如何从 streambuf 中获取一个或多个特定字节?

c++ - 预处理器定义在 Release模式下工作,而不是调试

c++ - 如何在 C/C++ 中检查 USB 是否插入或移除