LMS_SetSampleRate(lms_device_t *device, float_type rate,size_t oversample)
-
device: 设备句柄(lms_device_t*),在之前通过调用 LMS_Open() 获得。
-
rate: 采样率,以 Hz 为单位,设置为设备与主机之间数据交换的采样率。
-
oversample: RF 硬件的过采样比率。有效的过采样值有:
1, 2, 4, 8, 16, 32
0 表示使用设备默认的过采样值(通常由设备固件决定)。// 设置采样率为 10 MHz,过采样比率为 4 float sampleRate = 10000000.0; // 10 MHz size_t oversample = 4; int result = LMS_SetSampleRate(g_deviceSDR, sampleRate, oversample); if (result != 0) { std::cerr << "设置采样率失败。" << std::endl; }
- rate 参数指定了设备和主机之间数据交换的采样率。如果你设置 rate = 10000000.0(即 10 MHz),表示每秒主机接收 1000 万个复数样本(每个复数样本包括 I 和 Q)。
- oversample 参数控制 RF 硬件的采样率。过采样比率为 1 时表示没有过采样;过采样比率为更高的值,如 2、4、8 等,会增加 RF 硬件的采样频率。这通常用于提高信号的信噪比(SNR)或减少混叠效应。
在 LimeSDR 或类似的软件定义无线电系统中,过采样(oversampling)是一种技术,指的是硬件以比所需的最低奈奎斯特采样率更高的速率对射频信号(RF信号)进行采样。这样做的目的是捕捉更多的数据,然后通过下采样(downsampling)将数据率降低后再发送给处理单元(例如 PC)。
你提到的例子的解释:
过采样系数 = 2:这意味着硬件以比所需的采样率高两倍的速率来采样射频信号。
采样率:在这个例子中,目标采样率是 8 MHz,这意味着软件希望数据的采样速率为 8 百万次每秒。但由于过采样系数是 2,硬件会以 16 MHz 的速率采样 RF 信号(8 MHz × 2)。
下采样:在硬件以 16 MHz 的速率进行采样后,硬件会将采样数据 下采样 到 8 MHz,再将其发送到 PC。下采样是减少采样率的过程,通常是通过丢弃一些样本来完成的。在这个例子中,硬件会从每 16 MHz 的数据中每隔一个样本(即保留第 2 个样本)来实现下采样,最终得到 8 MHz 的数据。
为什么要使用过采样?
提高信号质量:过采样有助于提高信号质量,减少噪声。通过更高的采样率,可以更好地捕捉信号的细节,并在采样过程中滤除高频噪声。
防止混叠:过采样可以帮助防止混叠(aliasing)。混叠是指当采样速率不足时,高频信号的成分被错误地解释为低频成分。通过过采样,硬件可以更准确地表示高频成分,避免混叠现象。
改善滤波效果:通过过采样并在硬件中应用滤波器,能够更好地分离有用信号与噪声或干扰。过采样后的数据可以使用更精细的抗混叠滤波器,以提高信号质量。
例子:
假设你正在处理一个最大频率为 4 MHz 的信号(信号带宽),根据奈奎斯特定理,采样率至少需要是 8 MHz(最大频率的两倍)。但是,如果硬件进行过采样,将采样率提高到 16 MHz(过采样系数为 2),则硬件可以更好地捕捉信号的细节,进行更精确的过滤,并在采样后通过下采样将数据减少为 8 MHz,从而降低数据率的同时保持较好的信号质量。
LMS_RecvStream(lms_stream_t *stream, void *samples, size_t sample_count, lms_stream_meta_t *meta, unsigned timeout_ms)
- stream这是LimeSDR接收流的标识符(lms_stream_t 类型)。在调用 LMS_RecvStream 时,streamId 是指向接收流结构的指针,表示接收数据流的具体信息(比如频道、FIFO大小、数据格式等)。这个参数用于指定要从哪个接收流读取数据。
- samples这是一个指向存储接收到的数据的缓冲区的指针,通常是一个数组或动态分配的内存,用来存放从接收流中读取的样本数据。由于IQ数据由两个浮点数(I和Q)组成,因此缓冲区通常是 float 类型数组。
- sample_count这是你希望从接收流中读取的样本数量。sampleCnt 是一个整数,表示缓冲区的大小,通常为 LMS_RecvStream 调用所需的样本数。接收到的数据会填充到 buffer 中。
sampleCnt 指定的是单次读取的最大样本数,每个样本通常包含两个浮点数(一个I样本和一个Q样本)。 - meta这是一个指向 lms_stream_status_t 类型结构体的指针,LMS_RecvStream 会将接收流的状态写入这个结构体。通常你可以传入一个指针来获取流的状态信息(如是否有错误、当前FIFO的填充情况等)。
如果你不关心流的状态,可以将其设为 NULL,即不获取状态信息。 - timeout_ms这是超时时间,单位为毫秒。在接收数据时,如果在指定的时间内没有接收到足够的数据,函数将超时并返回。这个参数控制接收函数的超时行为
const int sampleCnt = 5000; //complex samples per buffer
int16_t buffer[sampleCnt * 2]; //buffer to hold complex values (2*samples))
//Start streaming
LMS_StartStream(&streamId);
//Streaming
auto t1 = chrono::high_resolution_clock::now();
while (chrono::high_resolution_clock::now() - t1 < chrono::seconds(5)) //run for 5 seconds
{
//Receive samples
int samplesRead = LMS_RecvStream(&streamId, buffer, sampleCnt, NULL, 1000);
}