rtl_sdr:可靠地检测频率变化,丢弃先前获得的样本

时间:2017-04-23 13:47:59

标签: c race-condition

我正在使用rtl_sdr和通用DVB-T棒(调谐器是FC0013)编写模拟调频收音机的搜索程序。代码主要来自rtl_power.crtl_fm.c

我的方法是:

  • 收听新频率
  • 收集一些样本
  • 测量RSSI并存储
  • 为下一个频率执行相同的操作
  • 在检测到高于某个阈值的局部峰值时,调谐到检测到它的频率。

问题在于我无法可靠地将样本映射到收集它们的频率。这是相关的(伪)代码片段:

/* freq is the new target frequency */
rtlsdr_cancel_async(dongle.dev);
optimal_settings(freq, demod.rate_in);
fprintf(stderr, "\nSeek: currently at %d Hz (optimized to %d).\n", freq, dongle.freq);
rtlsdr_set_center_freq(dongle.dev, dongle.freq);

/* get two bursts of samples to measure RSSI */
if (rtlsdr_read_sync(dongle.dev, samples, samplesSize, &samplesRead) < 0)
    fprintf(stderr, "\nSeek: rtlsdr_read_sync failed\n");
/* rssi = getRssiFromSamples(samples, samplesRead) */
fprintf(stderr, "\nSeek: rssi=%.2f", rssi);

if (rtlsdr_read_sync(dongle.dev, samples, samplesSize, &samplesRead) < 0)
    fprintf(stderr, "\nSeek: rtlsdr_read_sync failed\n");
/* rssi = getRssiFromSamples(samples, samplesRead) */
fprintf(stderr, "\nSeek: rssi=%.2f\n", rssi);

当我使用该代码片段扫描FM波段时,我发现两个RSSI测量值通常差别很大。特别是,第一次测量通常在从前一频率获取的第二次测量的附近,表明一些样本在仍然调谐到旧频率时被采集。

我还尝试在收集样本之前插入对rtlsdr_reset_buffer()的调用,以便冲洗仍然卡在管道中的任何样本,没有明显的影响。

的组合
usleep(500000);
rtlsdr_cancel_async(dongle.dev);
rtlsdr_reset_buffer(dongle.dev)
除了usleep()显着减慢搜索操作之外,

不会改变图片。 (缓冲区大小为16384个样本,采样率为200万,因此usleep()延迟远远高于获取一个样本脉冲所需的时间。)

我如何确保在调整到新频率后获得我拍摄的样本?

  • 在调谐到不同的频率后,是否有需要冲洗的样品缓冲区?
  • 我可以依靠rtlsdr_set_center_freq()返回时间完成调整,还是调谐器需要一段时间才能稳定下来?在后一种情况下,如何可靠地判断频率变化何时完成?
  • 我可能错过了什么?

1 个答案:

答案 0 :(得分:0)

再次查看rtl_power.c的代码,我发现了这个功能:

void retune(rtlsdr_dev_t *d, int freq)
{
    uint8_t dump[BUFFER_DUMP];
    int n_read;
    rtlsdr_set_center_freq(d, (uint32_t)freq);
    /* wait for settling and flush buffer */
    usleep(5000);
    rtlsdr_read_sync(d, &dump, BUFFER_DUMP, &n_read);
    if (n_read != BUFFER_DUMP) {
        fprintf(stderr, "Error: bad retune.\n");}
}

基本上,调谐器需要稳定,没有明确指示此过程何时完成。

rtl_power.c通过等待5毫秒来解决这个问题,然后丢弃一些样本(BUFFER_DUMP被定义为4096,采样率在1-2.8M之间)。

我发现4096个样本不够用,所以我最多选择了16384个。结果看起来稳定得多,尽管这对调谐器来说似乎并不足以稳定。

对于频段扫描,另一种方法是使环路获取样本并确定其RSSI直到RSSI值开始稳定,即变化不再是单调的或低于某个阈值。