Engee 文档
Notebook

英语中的过滤

在这个例子中,我们将分析指定信号的可能性,对其进行滤波的方法以及改变信号频率的方法,以及分析在与信号交互的每个阶段对信号的频谱功率密

连接图书馆

In [ ]:
Pkg.add(["Noise", "DSP", "DigitalComm"])
   Resolving package versions...
    Updating `~/.project/Project.toml`
  [a7b11256] + DigitalComm v1.2.0
  [81d43f40] + Noise v0.3.3
    Updating `~/.project/Manifest.toml`
  [a7b11256] + DigitalComm v1.2.0
  [81d43f40] + Noise v0.3.3
  [d96e819e] + Parameters v0.12.3
  [e409e4f3] + PoissonRandom v0.4.4
  [3a884ed6] + UnPack v1.0.2
Precompiling project...
Noise
  1 dependency successfully precompiled in 4 seconds. 23 already precompiled.
In [ ]:
using Plots; # Билиотека отрисовки графиков
using Noise; # Библиотека добавления шумов
using DigitalComm; # Библиотека систем связи
using DSP; # Библиотека цифровой обработки сигналов
using FFTW; # Библиотека преобразований Фурье
plotlyjs(); # Подключения метода отрисовки

设置正弦波

示例中的所有变换都将在此正弦曲线上进行。

In [ ]:
fs = 5000; # Шагов в секунду
t = [0:1/fs:1;]; # Время

y = sin.(2*pi*10*t); # Задание синусоиды

plot(t,y)
Warning: attempting to remove probably stale pidfile
  path = "/user/.jlassetregistry.lock"
@ Pidfile /usr/local/ijulia-core/packages/Pidfile/DDu3M/src/Pidfile.jl:260
Out[0]:

让我们使用periodogram来估计信号的频谱功率密度,这是一个基于计算一个数据序列的傅里叶变换模的平方的periodogram构造函数。

物理和信号处理中的频谱功率密度(spm)是描述信号功率随频率的分布的函数,即每单位频率间隔的功率。

In [ ]:
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)
Out[0]:

量化

转换信号的下一步将是它的量化-将信号的参考值范围拆分为有限数量的电平,并将这些值舍入到最接近它们的两个电平之一。

In [ ]:
y_quant = quantization(y, 80, minv=-1, maxv=1); # Квантование исходной синусоиды

# Вывод результата
plot(y[1:250], label="исходный сигнал")
plot!(y_quant[1:250], label="квантованный сигнал по 80 уровням")
Out[0]:
In [ ]:
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)
Out[0]:

正如我们所看到的,这种变换不会影响信号的频谱功率密度,也不会改变其频率。

数据细化

我们将对原始正弦曲线执行的下一步是数据细化。 我们将从原始信号中提取每一秒样本。

In [ ]:
y_d = y_quant[1:2:end]
t_new = t[1:2:end]
plot(t_new,y_d)
Out[0]:
In [ ]:
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)
Out[0]:

周期图显示,细化数据会增加信号的频率。 这是由于这样的事实,即由于样本数量减半,振荡频率相应地增加了一倍。

噪声叠加

噪声是阻止我们从有用信号接收信息的不良现象。

噪声本质上是随机的。

在数字信号处理中,**加性白高斯噪声(ABGSH)**最常用。

其特点是:
*均匀的光谱功率密度(这就是为什么它被称为白色);
*时间值的正态分布(因此称为高斯);
*它与一个有用的信号(因此它被称为加法)相结合;
*ABSH在统计上与有用信号无关。

In [ ]:
signal = addNoise(y_d, 20); # Добавление шумов

plot(t_new, signal, label="синусоида с шумом")
plot!(t_new, y_d, label="синусоида без шума")
Out[0]:

重要的是要注意功能 addNoise 设置一个元组,我们只需要第一个向量。
下面的代码显示了登录数据的类型 addNoise,其输出和从元组中提取第一向量的结果。

In [ ]:
typeof(y_d)
Out[0]:
Vector{Float64} (alias for Array{Float64, 1})
In [ ]:
typeof(signal)
Out[0]:
Tuple{Vector{Float64}, Vector{Float64}}
In [ ]:
signal=signal[1];
In [ ]:
typeof(signal)
Out[0]:
Vector{Float64} (alias for Array{Float64, 1})

Engee中的信号滤波

在这个例子中,我们将分析三个过滤器,但在Engee文档中,您可以找到所需的任何过滤器。
我们将考虑的第一种方法是通过滤波器系数设置滤波器,以两个矢量的形式。 ab,然后我们在分子的系数方面实现滤波器的表示
b 和分母 a 使用函数的传递函数 PolynomialRatio 载于图书馆 DSP.

注:
ba 可以指定为对象 Polynomial,或
度最大到最小排序的向量。

In [ ]:
b = [0.75, 0.5];
a = [1, 0.2, 0.1];
f = PolynomialRatio(b,a);

Out_sig = filt(f,signal);

此过滤器不是decemming。 您可以通过比较滤波器输入和输出的大小来验证这一点。

In [ ]:
size(Out_sig,1)==size(signal,1)
Out[0]:
true
In [ ]:
plot(signal, label="исходный сигнал")
plot!(Out_sig, label="отфильтрованный сигнал")
Out[0]:

设置相同滤波器的第二个选项是通过使用函数的脉冲响应 impresp,然后使用函数计算滤波器输出 conv.

In [ ]:
h = impresp(f);
Out_sig2 = conv(signal,h);

plot(signal, label="исходный сигнал")
plot!(Out_sig2, label="отфильтрованный сигнал")
Out[0]:

让我们比较filt函数的输出和conv函数的输出。

In [ ]:
plot(Out_sig[1:2500]-Out_sig2[1:2500])
Out[0]:

从图中我们可以看到,函数的输出是 filt 和函数输出 conv 他们几乎完全重合。

我们将分析的第三个过滤选项是设置一个窗口FIR滤波器。 它将不同于以前的,因为它有一个延迟相对于输入信号等于窗口大小。

In [ ]:
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="исходный сигнал")
Out[0]:

为了比较滤波器输出,我们使用Welch周期图。

In [ ]:
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")
Out[0]:

正如我们所看到的,滤波器输出之间的主要区别在于它们的频谱功率密度。

改变信号频率

为了增加或减少计数的数量,Engee使用命令 resample,它允许您执行 upsamplingdownsampling 的信号。

注: upsamplingdownsampling 它们是使用关系来设置的 n//k,在哪里:

n:需要创建的点数;

k:每个点要考虑的最近邻居的数量。

In [ ]:
# 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)
Out[0]:

正如我们所看到的,滤波信号的频率增加了一倍。

In [ ]:
# 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)
Out[0]:

正如我们所看到的,滤波信号的频率已经减半。

In [ ]:
println("Размер входа: ",size(Out_fir,1))
println("Размер при downsampling: ",size(rs,1))
println("Размер при upsampling: ",size(rs2,1))
Размер входа: 2501
Размер при downsampling: 1251
Размер при upsampling: 5001
In [ ]:
plot(rs)
plot!(rs2)
Out[0]:

在比较信号及其大小时,我们可以观察到相同的效果。 由 downsampling 信号样本的数量减少,并且当 upsampling 相反,它相对于原始信号增加。

结论

在这个例子中,我们展示了与信号交互的可能性,并表明Engee可以完全应用于数字信号处理。