英语中的过滤
在这个例子中,我们将分析指定信号的可能性,对其进行滤波的方法以及改变信号频率的方法,以及分析在与信号交互的每个阶段对信号的频谱功率密
连接图书馆
Pkg.add(["Noise", "DSP", "DigitalComm"])
using Plots; # Билиотека отрисовки графиков
using Noise; # Библиотека добавления шумов
using DigitalComm; # Библиотека систем связи
using DSP; # Библиотека цифровой обработки сигналов
using FFTW; # Библиотека преобразований Фурье
plotlyjs(); # Подключения метода отрисовки
设置正弦波
示例中的所有变换都将在此正弦曲线上进行。
fs = 5000; # Шагов в секунду
t = [0:1/fs:1;]; # Время
y = sin.(2*pi*10*t); # Задание синусоиды
plot(t,y)
让我们使用periodogram来估计信号的频谱功率密度,这是一个基于计算一个数据序列的傅里叶变换模的平方的periodogram构造函数。
物理和信号处理中的频谱功率密度(spm)是描述信号功率随频率的分布的函数,即每单位频率间隔的功率。
y_p = DSP.periodogram(y, onesided=true, nfft=length(y), fs=fs);
plot(freq(y_p)[1:20], power(y_p)[1:20], xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
量化
转换信号的下一步将是它的量化-将信号的参考值范围拆分为有限数量的电平,并将这些值舍入到最接近它们的两个电平之一。
y_quant = quantization(y, 80, minv=-1, maxv=1); # Квантование исходной синусоиды
# Вывод результата
plot(y[1:250], label="исходный сигнал")
plot!(y_quant[1:250], label="квантованный сигнал по 80 уровням")
y_p = DSP.periodogram(y_quant, onesided=true, nfft=length(y_quant), fs=fs);
plot(freq(y_p)[1:20], power(y_p)[1:20], xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
正如我们所看到的,这种变换不会影响信号的频谱功率密度,也不会改变其频率。
数据细化
我们将对原始正弦曲线执行的下一步是数据细化。 我们将从原始信号中提取每一秒样本。
y_d = y_quant[1:2:end]
t_new = t[1:2:end]
plot(t_new,y_d)
y_p = DSP.periodogram(y_d, onesided=true, nfft=length(y_d), fs=fs);
plot(freq(y_p)[1:20], power(y_p)[1:20], xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
周期图显示,细化数据会增加信号的频率。 这是由于这样的事实,即由于样本数量减半,振荡频率相应地增加了一倍。
噪声叠加
噪声是阻止我们从有用信号接收信息的不良现象。
噪声本质上是随机的。
在数字信号处理中,**加性白高斯噪声(ABGSH)**最常用。
其特点是:
*均匀的光谱功率密度(这就是为什么它被称为白色);
*时间值的正态分布(因此称为高斯);
*它与一个有用的信号(因此它被称为加法)相结合;
*ABSH在统计上与有用信号无关。
signal = addNoise(y_d, 20); # Добавление шумов
plot(t_new, signal, label="синусоида с шумом")
plot!(t_new, y_d, label="синусоида без шума")
重要的是要注意功能 addNoise 设置一个元组,我们只需要第一个向量。
下面的代码显示了登录数据的类型 addNoise,其输出和从元组中提取第一向量的结果。
typeof(y_d)
typeof(signal)
signal=signal[1];
typeof(signal)
Engee中的信号滤波
在这个例子中,我们将分析三个过滤器,但在Engee文档中,您可以找到所需的任何过滤器。
我们将考虑的第一种方法是通过滤波器系数设置滤波器,以两个矢量的形式。 a 和 b,然后我们在分子的系数方面实现滤波器的表示
b 和分母 a 使用函数的传递函数 PolynomialRatio 载于图书馆 DSP.
注:
b 和 a 可以指定为对象 Polynomial,或
度最大到最小排序的向量。
b = [0.75, 0.5];
a = [1, 0.2, 0.1];
f = PolynomialRatio(b,a);
Out_sig = filt(f,signal);
此过滤器不是decemming。 您可以通过比较滤波器输入和输出的大小来验证这一点。
size(Out_sig,1)==size(signal,1)
plot(signal, label="исходный сигнал")
plot!(Out_sig, label="отфильтрованный сигнал")
设置相同滤波器的第二个选项是通过使用函数的脉冲响应 impresp,然后使用函数计算滤波器输出 conv.
h = impresp(f);
Out_sig2 = conv(signal,h);
plot(signal, label="исходный сигнал")
plot!(Out_sig2, label="отфильтрованный сигнал")
让我们比较filt函数的输出和conv函数的输出。
plot(Out_sig[1:2500]-Out_sig2[1:2500])
从图中我们可以看到,函数的输出是 filt 和函数输出 conv 他们几乎完全重合。
我们将分析的第三个过滤选项是设置一个窗口FIR滤波器。 它将不同于以前的,因为它有一个延迟相对于输入信号等于窗口大小。
responsetype = Lowpass(5; fs=30) # Определение полосы пропускания
designmethod = FIRWindow(hanning(128)) # Определение размеров окна
Out_fir = filt(digitalfilter(responsetype, designmethod), Out_sig)
plot(Out_sig, label="исходный сигнал")
plot!(Out_fir, label="исходный сигнал")
为了比较滤波器输出,我们使用Welch周期图。
n=div(length(Out_sig),8);
y_out = welch_pgram(Out_sig, n, div(n,2), onesided=true, nfft=length(Out_sig), fs=fs);
n=div(length(Out_sig2),8);
y_in = welch_pgram(Out_sig2, n, div(n,2), onesided=true, nfft=length(Out_sig2), fs=fs);
n=div(length(Out_fir),8);
y_fir = welch_pgram(Out_fir, n, div(n,2), onesided=true, nfft=length(Out_fir), fs=fs);
plot(freq(y_in)[1:25], power(y_in)[1:25], xlabel="частота, Гц", ylabel="спектральная плотность мощности", label="filt")
plot!(freq(y_out)[1:25], power(y_out)[1:25], xlabel="частота, Гц", ylabel="спектральная плотность мощности", label="conv")
plot!(freq(y_fir)[1:25], power(y_fir)[1:25], xlabel="частота, Гц", ylabel="спектральная плотность мощности", label="fir")
正如我们所看到的,滤波器输出之间的主要区别在于它们的频谱功率密度。
改变信号频率
为了增加或减少计数的数量,Engee使用命令 resample,它允许您执行 upsampling 和 downsampling 的信号。
注: upsampling 和 downsampling 它们是使用关系来设置的 n//k,在哪里:
n:需要创建的点数;
k:每个点要考虑的最近邻居的数量。
# Downsampling
rs = resample(Out_fir, 1//2)
n=div(length(rs),8);
y_out = welch_pgram(rs, n, div(n,2), onesided=true, nfft=length(rs), fs=fs);
plot(freq(y_out)[1:25], power(y_out)[1:25], xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
正如我们所看到的,滤波信号的频率增加了一倍。
# Upsampling
rs2 = resample(Out_fir, 2//1)
n=div(length(rs2),8);
y_out = welch_pgram(rs2, n, div(n,2), onesided=true, nfft=length(rs2), fs=fs);
plot(freq(y_out)[1:25], power(y_out)[1:25], xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
正如我们所看到的,滤波信号的频率已经减半。
println("Размер входа: ",size(Out_fir,1))
println("Размер при downsampling: ",size(rs,1))
println("Размер при upsampling: ",size(rs2,1))
plot(rs)
plot!(rs2)
在比较信号及其大小时,我们可以观察到相同的效果。 由 downsampling 信号样本的数量减少,并且当 upsampling 相反,它相对于原始信号增加。
结论
在这个例子中,我们展示了与信号交互的可能性,并表明Engee可以完全应用于数字信号处理。