我正在使用rtl_sdr和通用DVB-T棒(调谐器是FC0013)编写模拟调频收音机的搜索程序。代码主要来自rtl_power.c
和rtl_fm.c
。
我的方法是:
问题在于我无法可靠地将样本映射到收集它们的频率。这是相关的(伪)代码片段:
/* 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()
返回时间完成调整,还是调谐器需要一段时间才能稳定下来?在后一种情况下,如何可靠地判断频率变化何时完成?答案 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值开始稳定,即变化不再是单调的或低于某个阈值。