主要内容

ADALM-PLUTO无线电频率校正

这个例子展示了如何使用comm.SDRRxPluto和comm.SDRTxPluto的频率校正特性同步两个plutosdr的基带采样率和中心频率。

一个plutodr的基带采样率和中心频率是由同一个振荡器物理推导出来的。尽管每个PlutoSDR都经过工厂校准,使用适当的锁相环设置来数字补偿振荡器的组件变化,但由于量化效应和操作条件(特别是温度)的变化,补偿是不完美的。因此,即使两个plutosdr对应的System对象使用相同的BasebandSampleRate和CenterFrequency属性值,两个plutosdr将以稍微不同的基带采样率和中心频率运行。为了解决这个问题,可以使用comm.SDRRxPluto和comm.SDRTxPluto的频率校正特性。

FrequencyCorrection属性指定基带采样率和中心频率的百万分之几变化。默认值是0,这意味着无线电将使用其出厂校准的锁相环设置。在这个例子中,我们将一个PlutoSDR(发射机)作为一个具有准确基带采样率和中心频率的源。我们使用另一个接收端PlutoSDR接收的信号,来估计接收端System对象的正确的FrequencyCorrection值,并表明当频率校正设置适当时,发射器和接收器之间的频率偏移几乎完全被消除。

指的是开始有关配置主机以使用PlutoSDR的详细信息的文档。

频率校正估计算法

假设一个信号从一个PlutoSDR传输到另一个PlutoSDR。让f c {} $ $f{年代}$ $为发射机的中心频率和基带采样率。让f {c '} $ $f{年代}$ $为接收机的中心频率和基带采样率。假设发射机的振荡器没有漂移,接收机的振荡器漂移了一个因子K美元,即$f_{c} = K * f_{c}$$f_{s} = K * f_{s}$在哪里K美元是一个非常接近1的数。

基带频率的音f {ref} $ $在传输的信号中将出现基带频率的音调f{收到}$ $在接收器里,在哪里$ f{收到}= {{f {ref} + (f c {} - K * f_c)} \ / {K}} $.这个词$ (f c {} - K * f_c)美元在分子中是由于中心频率的不匹配。比例因子K美元在分母是由于不匹配的基带采样率。因此,我们可以解K美元f {ref} $ $f{收到}$ $,f_c美元$K = {{f_c + f_{ref}}\over{f_c + f_{received}} $

为了消除发射机和接收机之间的频率偏移,我们需要将基带采样率和接收机的中心频率按倍缩放1美元\ / K美元.让$ p $为基带采样率和接收机中心频率的百万分之几变化。然后$1 + {p\ / 10^6} = {1\ / K}$.因此$ p = {f f {ref}{收到}- {}\ / f c {} {+ f {ref}}} * 10 ^ 6美元

设置发射器和接收器

我们使用一个PlutoSDR在20、40和80千赫传输三个音调。在80千赫的音调是用来估计频率校正的价值为接收器。20和40千赫的音调只用于帮助可视化频谱。

%设置参数和信号sampleRate = 200年e3;centerFreq = 2.42 e9;fRef = 80年e3;s1 = exp (1 j * 2 *π* 20 e3 * [0:10000-1] / sampleRate);% 20千赫s2 = exp (1 j * 2 *π* 40 e3 * [0:10000-1] / sampleRate);% 40千赫s3 j = exp(1 * 2 *π* fRef * [0:10000-1] / sampleRate);% 80千赫S = s1 + s2 + s3;= 0.6 *年代/ max (abs (s));%缩放信号,以避免在时域的裁剪安装发射机% FrequencyCorrection使用默认值0,对应于%工厂校准条件tx = sdrtx (“冥王星”“RadioID”“usb: 1”“CenterFrequency”centerFreq,...“BasebandSampleRate”sampleRate,“获得”0,...“ShowAdvancedProperties”,真正的);%使用info方法显示各种硬件相关的实际值%属性txRadioInfo = info (tx)%发送信号disp (“发送3个音调,分别为20、40和80千赫”);transmitRepeat (tx, s);%设置接收器% FrequencyCorrection使用默认值0,对应于%工厂校准条件numSamples = 1024 * 1024;rx = sdrrx (“冥王星”“RadioID”“usb: 0”“CenterFrequency”centerFreq,...“BasebandSampleRate”sampleRate,“SamplesPerFrame”numSamples,...“OutputDataType”“双”“ShowAdvancedProperties”,真正的);%使用info方法显示各种硬件相关的实际值%属性rxRadioInfo = info (rx)
##连接硬件这个过程可能需要几秒钟。txRadioInfo = struct with fields: Status: 'Full information' CenterFrequency: 2.4200e+09 BasebandSampleRate: 199999 SerialNum: '104473ce69910007ffff2d00682289eb65' Gain: 0 RadioFirmwareVersion: "0.30" ExpectedFirmwareVersion: "0.30" HardwareVersion: "B0" FrequencyCorrection:0发送3个音调在20,40,和80千赫##建立连接到硬件。这个过程可能需要几秒钟。##波形传输已成功启动,并将无限期重复。##调用release方法来停止传输。##连接硬件这个过程可能需要几秒钟。rxRadioInfo =结构体字段:状态:“完全信息”CenterFrequency: 2.4200 e + 09 BasebandSampleRate: 199999 SerialNum:“104473 ce6991000704002c004c2c893f08”GainControlMode:“AGC缓慢的攻击”RadioFirmwareVersion:“0.30”ExpectedFirmwareVersion:“0.30”HardwareVersion:“B0”EnableQuadratureCorrection: 1 EnableRFDCCorrection: 1 EnableBasebandDCCorrection: 1 FrequencyCorrection: 0

接收和可视化信号

disp ([“捕获信号并观察频率偏移”newline]) receivedSig = rx();找到对应于80千赫传输的音调y = fftshift (abs (fft (receivedSig)));[~, idx] = findpeaks(y,“MinPeakProminence”马克斯(0.5 * y));fReceived = (max (idx) -numSamples / 2 - 1) / numSamples * sampleRate;%绘制频谱sa = dsp。简介(“SampleRate”sampleRate,“SpectralAverages”4);sa。标题= sprintf (“预期声音为80千赫,实际接收到百分比。”3 f千赫...fReceived / 1000);receivedSig =重塑(receivedSig, [], 16);%重新整形为16列i = 1:size(receivedSig, 2) sa(receivedSig(:,i));结束
捕获信号并观察频率偏移##建立硬件连接这个过程可能需要几秒钟。

频率修正值的估算与应用

rx。频率修正= (centerFreq - fRef) / (centerFreq + fRef) * 1e6;味精= sprintf ([根据在%检测到的音调。3 f kHz,”...“接收器的频率修正值应设置为%.4f”],...fReceived / 1000, rx.FrequencyCorrection);disp(味精);rxRadioInfo = info (rx)
基于发现语气82.510 kHz, FrequencyCorrection的接收器应该设置为1.0373 rxRadioInfo =结构体字段:状态:“完全信息”CenterFrequency: 2.4200 e + 09 BasebandSampleRate: 200000 SerialNum:“104473 ce6991000704002c004c2c893f08”GainControlMode:“AGC缓慢的攻击”RadioFirmwareVersion:"0.30" ExpectedFirmwareVersion: "0.30" HardwareVersion: "B0" enablequadraturecrection: 1 EnableRFDCCorrection: 1 EnableBasebandDCCorrection: 1 FrequencyCorrection: 1.0250

接收和可视化信号

%捕获10帧,但只使用最后一帧跳过瞬态%效果由于改变频率修正disp ([“捕获信号并验证频率校正”换行符)i = 1:10 receivedSig = rx();结束找到对应于80千赫传输的音调% fReceived2应该非常接近80khzy = fftshift (abs (fft (receivedSig)));[~, idx] = findpeaks (y,“MinPeakProminence”马克斯(0.5 * y));fReceived2 = (max (idx) -numSamples / 2 - 1) / numSamples * sampleRate;%绘制频谱sa。Title =“在20、40和80千赫接收3个音调”;receivedSig =重塑(receivedSig, [], 16);%重新整形为16列i = 1:size(receivedSig, 2) sa(receivedSig(:,i));结束味精= sprintf (“在%检测到音调。3 f kHz \ n”, fReceived2/1000);disp(味精);
捕获信号并验证频率校正音检测在80.002 kHz

改变发射机的频率校正

现在我们改变发射机的频率校正特性来模拟发射机振荡器漂移的效果。

disp ([“将发射机的频率校正属性改为1至”...“模拟发射机振荡器漂移的效果”) tx.FrequencyCorrection = 1;% 1 ppmtxRadioInfo = info(tx) tx. transmitrepeat (s);
将发射机的FrequencyCorrection属性更改为1,以模拟发射机的振荡器漂移txRadioInfo = struct的效果:Status: 'Full information'“0.30”ExpectedFirmwareVersion:“0.30”硬件版本:“B0”频率修正:1.0000 ##波形传输已经成功开始,并将无限期重复。##调用release方法来停止传输。

接收和可视化信号

%捕获10帧,但只使用最后一帧跳过瞬态%效果由于改变频率修正disp ([“捕获信号并观察频率偏移”换行符)i = 1:10 receivedSig = rx();结束找到对应于80千赫传输的音调% fReceived3将不会接近80千赫,因为tx.FrequencyCorrection%已更改y = fftshift (abs (fft (receivedSig)));[~, idx] = findpeaks (y,“MinPeakProminence”马克斯(0.5 * y));fReceived3 = (max (idx) -numSamples / 2 - 1) / numSamples * sampleRate;%绘制频谱sa。标题= sprintf (“预期声音为80千赫,实际接收到百分比。”3 f千赫...fReceived3/1000);receivedSig =重塑(receivedSig, [], 16);%重新整形为16列i = 1:size(receivedSig, 2) sa(receivedSig(:,i));结束
捕获信号并观察频率偏移

频率修正值的估算与应用

我们使用相同的方法来估计基带采样率和接收机中心频率所需的百万分之一变化。但是,估计值需要与当前非零的FrequencyCorrection设置进行适当的组合。自美元(1 + {p_1} / 10 ^ 6) * (1 + {p_2} / 10 ^ 6) = 1 + ({p_1} + {p_2} + {p_1} * {p_2} * 10 ^{6}) / 10 ^ 6美元,应用两个更改p_1美元p_2美元连续等效于应用的单个变化${p_1} + {p_2} + {p_1}*{p_2}*10^{-6}$与工厂校准的条件。

rxRadioInfo = info (rx);currentPPM = rxRadioInfo.FrequencyCorrection;ppmToAdd = (fReceived3 - fRef) / (centerFreq + fRef) * 1e6; / /当前位置rx。频率校正= currentPPM + ppmToAdd + currentPPM*ppmToAdd/1e6;味精= sprintf ([根据在%检测到的音调。3 f kHz,”...'接收机的频率修正值应由%更改。4 f % .4f '],...fReceived3/1000、currentPPM rx.FrequencyCorrection);disp(味精);rxRadioInfo = info (rx)
基于发现语气82.402 kHz, FrequencyCorrection接收者应该从1.0250改为2.0174 rxRadioInfo =结构体字段:状态:“完全信息”CenterFrequency: 2.4200 e + 09 BasebandSampleRate: 200000 SerialNum:“104473 ce6991000704002c004c2c893f08”GainControlMode:“AGC缓慢的攻击”RadioFirmwareVersion:"0.30" ExpectedFirmwareVersion: "0.30" HardwareVersion: "B0" enablequadraturecrection: 1 EnableRFDCCorrection: 1 EnableBasebandDCCorrection: 1 FrequencyCorrection: 2.0250

接收和可视化信号

%捕获10帧,但只使用最后一帧跳过瞬态%效果由于改变频率修正disp ([“捕获信号并验证频率校正”换行符)i = 1:10 receivedSig = rx();结束找到对应于80千赫传输的音调% fReceived4应该非常接近80khzy = fftshift (abs (fft (receivedSig)));[~, idx] = findpeaks (y,“MinPeakProminence”马克斯(0.5 * y));fReceived4 = (max (idx) -numSamples / 2 - 1) / numSamples * sampleRate;%绘制频谱sa。Title =“在20、40和80千赫接收3个音调”;receivedSig =重塑(receivedSig, [], 16);%重新整形为16列i = 1:size(receivedSig, 2) sa(receivedSig(:,i));结束味精= sprintf (“在%检测到音调。3 f千赫, fReceived4/1000);disp(味精);放开收音机释放(tx);释放(rx);
捕获信号并验证频率校正音调检测在79.965 kHz