使用EngeeDSP进行多速处理
多速率信号处理(Multirate Signal Processing)是数字信号处理(DSP)的一个领域,处理处理过程的不同部分以不同采样率(BH)运行的系统。
简而言之,它是数字系统内信号采样率(每秒采样数)的变化。 大多数情况下,改变是为了节省计算资源(具有过高的信号采样率),标准(例如,音频44.1khz和48khz)的兼容性,多相滤波器的实现,等等。
主要操作是增加和减少采样率的整数倍。 它们的组合还允许您以分数次更改BH(,在哪里 和 -整个)。
在这个例子中,我们将考虑来自用于将BH信号增加2.5倍(插值)的任务的EngeeDSP库的函数,并且还注意到在这种系统的实际实现中使用低通滤波器(low-pass filters)的重
include("helper.jl")                # подключение набора доп. функций
测试信号进行处理
作为测试信号,我们将生成一个主频率为100hz的正弦曲线,采样频率为2khz。 任务是将正弦波的采样率提高2.5倍,即提高5倍,然后减半。
fs = 2000;                  # частота дискретизации сигнала
f0 = 100;                   # основная частота повторений синусоиды
dt = 1/fs;                  # шаг временной сетки
t = 0:dt:0.1-dt;            # вектор отсчётов времени
sig = sin.(2*pi*t*f0);      # тестовый сигнал дискретной синусоиды
plot(t, sig, l=:steppost, m=:dot, ms=2, xlim=(0,0.01), legend=false)
让我们确保在频率为100Hz的频谱上只有一个重要分量。:
S, fvec = fftspectrum(sig, fs; onesided=true);
plot(fvec, S, legend=false)
我们还要注意沿频率轴的频谱显示的限制-第一奈奎斯特区。 它被限制在1000赫兹。
采样率增加5倍,减少2倍
在实际DSP系统中,应用经典插值算法是不切实际的,而且通常是不可能的。 但是对于离散信号,可以对采样执行基本操作,例如抽取整数次,或者在原始信号的采样之间添加整数个零。 需要注意的是,当采样速率改变小数倍时,加零(增加BH)的操作总是先于抽取操作(降低BH),这样就不会发生信息丢失。 让我们看看在描述的基本操作之后波形及其频谱会发生什么。
的插值系数
首先,我们通过在信号的采样之间加零来执行增加采样频率的操作。 该功能将帮助我们做到这一点。 **upsample来自EngeeDSP图书馆。**以较小的步长创建新的时间网格向量 **dtL**并显示波形 **up**在时间轴上:
L = 5;
up = EngeeDSP.Functions.upsample(sig, L);
dtL = 1/(fs*L);
tL = 0:dtL:0.1-dtL;
plot(t, sig, l=:steppost)
plot!(tL, up, l=:steppost, m=:dot, ms=2, xlim=(0,0.01), legend=false)
原始正弦曲线的形状强烈失真,我们还可以在扩展的第一奈奎斯特频带上观察频谱拷贝-从0到5000Hz。:
Sup, fvec_up = fftspectrum(up, fs*L; onesided=true);
plot(fvec_up, Sup, legend=false)
当以这种方式增加采样频率时,我们扩展第一奈奎斯特区并观察离散信号的频谱的周期性结构。
如果我们试图用一个函数来缩小这样一个信号 **downsample**通过抛出每一秒元素(抽取系数 ),我们将获得所需的2500Hz采样频率,但形状和频谱仍然会失真。:
M = 2;
down = EngeeDSP.Functions.downsample(up, M);
dtM = 1/(fs*L/M);
tM = 0:dtM:0.1-dtM;
plot(tM, down, l=:steppost, m=:dot, ms=2, xlim=(0,0.01), legend=false)
由于混叠,我们看到光谱副本"包裹"在产生的第一奈奎斯特区。:
Sdown, fvec_down = fftspectrum(down, fs*L/M; onesided=true);
plot(fvec_down, Sdown, legend=false)
为了保持正弦波的形状,重要的是在产生的频谱中只保留一个分量-频率为100Hz的峰值。 数字低通滤波器(低通滤波器)将帮助我们抑制频谱拷贝。
交互式应用程序中的LPF开发
低通滤波器在提高采样频率的操作期间执行抗成像(抑制频谱拷贝)的功能,以及在降低采样频率的操作期间执行抗混叠(限制有用信号的频谱上限)。
过滤器规格
我们知道原始有效信号的频谱限制在1000Hz。 我们还知道,低通滤波器是在加零操作之后应用的,这意味着它以增加的采样率工作-在我们的例子中,在10kHz。 这是值得选择其频率响应的形式,使带宽约限于1000赫兹,并在同一时间,体面的抑制提供带外。
也值得考虑滤波器顺序。 它越高,频率响应形状越接近理想的(矩形)形状,但是大的滤波器阶数引入了大的延迟,并且在硬件中也更难以实现。 我们将为我们的低通滤波器建立以下要求:
*采样率-10,000Hz
*带宽限制为800Hz
*屏障带的开始是1500赫兹
*过滤器类型相等-脉动
*在带宽纹波-不超过0.1分贝
*屏障带中的衰减-至少60dB
*过滤器顺序是此规格的最小可能
数字滤波器编辑器应用程序
打开交互式数字滤波器编辑器应用程序,设置滤波器规格,然后单击滤波器合成按钮。 我们观察频率响应的形状,以及合成的低频-68的顺序:
 
我们可以上传滤波器系数。 由于我们已经合成了FIR滤波器,我们只对其传递函数的分子的系数感兴趣。 我们会把它们保存到一个文件中。 num.txt.
 
让我们对信号应用一个滤波器 up. 为此,我们将分子和信号的系数转移到函数的输入 filter 来自EngeeDSP。 过滤的结果将被写入一个变量 up_filtered. 然后我们将这个信号与函数 downsample,并将结果保存到变量中 decimated.
using DelimitedFiles
b = vec(readdlm("num.txt"));
up_filtered = EngeeDSP.Functions.filter(b,1,up) * L;
decimated = EngeeDSP.Functions.downsample(up_filtered,M);
plot(t, sig, l=:steppost, m=:dot, ms=2, xlim=(0,0.02))
plot!(tM, decimated, l=:steppost, m=:dot, ms=2, legend=false)
我们可以看到正弦信号的形状已经恢复。 在时域中,存在与FIR滤波器的使用相关联的明显延迟。 您还可以看到我们将滤波结果乘以插值系数。 . 这是必要的,为了不失去信号的能量,增加额外的零后下降。
让我们确保输出信号中的频谱副本已被低通滤波器成功抑制。:
Sdecim, fvec_decim = fftspectrum(decimated, fs*L/M; onesided=true);
plot(fvec_down, Sdown, legend=false)
plot!(fvec_down, Sdecim, lw=3, ylim=(-80,0))
专用插值和抽取函数的应用
该EngeeDSP包含以下功能 **interp**及 decimate,通过自动合成低通滤波器执行增加和减少采样频率以及滤波的操作。 它们不引入延迟,因为它们使用零相位滤波。 这些函数对于分析和原型设计很有用,但不能反映真实顺序DSP系统的行为。 然而,合成的低通FIR滤波器的系数可以从这些函数中提取作为附加的输出参数。
让我们评估应用该函数的结果 interp:
isig, bb = EngeeDSP.Functions.interp(sig,L);
plot(tL, isig, l=:steppost, m=:dot, ms=2, xlim=(0,0.02), legend=false)
dsig = EngeeDSP.Functions.decimate(isig,M);
plot(t, sig, l=:steppost, xlim=(0,0.02), legend=false)
plot!(tM, dsig, l=:steppost, m=:dot, ms=2)
最后,我们将显示自动计算的低通滤波器的脉冲响应。:
plot(bb, l=:stem, m=:c, c=6, mc=14, legend=false, title = "ИХ ФНЧ функции interp")
降低采样率时的混叠效应:
总之,我们将考虑混叠的影响,即当采样频率降低到这样的值时,当Kotelnikov定理的主要条件不再满足时,即当信号频谱中最大的频率超出时,将信号的频谱分量"包裹"到第一奈奎斯特区 .
让我们用基频为2.4khz的正弦音调的例子来直观地和听觉地评估效果。 通过使用滑块改变采样频率的值,如果没有观察到Kotelnikov定理的条件,则可以观察到音调基频的变化。 从价值开始 Hz,音调会开始降低:
fs = 6000 # @param {type:"slider",min:3000,max:6000,step:500}
dt = 1/fs;
t = 0:dt:1;
f0 = 2400;
x = sin.(2*pi*f0*t);
S_1, fv_1 = fftspectrum(x, fs; onesided=true);
audioplayer(x,fs)
plot(fv_1, S_1, legend=false, size=(800,200), ylim=(-80,0))
结论
多速处理是DSP中的基础工具,可让您有效控制信号的采样频率,以节省计算能力,匹配不同的数字系统,分析不同频段的信号,并提高转换质量。 没有它,现代通信标准,音频和视频编解码器将是不可能的,许多计算任务将是不合理的昂贵。
我们研究了如何使用EngeeDSP库中的函数开发多速处理系统的原型。