Engee 文档
Notebook

过滤器的比较分析

此示例显示了噪声正弦曲线的滤波模型,使用各种滤波方法进行进一步比较。

image.png

初始数据:

  1. 正弦波的频率(信号的中心频率):100kHz。
  2. 噪声功率:10^-7.
In [ ]:
Sample_Time = 10^-6
Signal_Amplitude = 1
Сenter_frequency = 628318.5 # 高兴/高兴
Noise_power = 10^-7;

计算数据:

  1. 通带边缘频率(带宽限制)表示信号以最小的失真通过的频率限制。 对于中心频率为100kHz的正弦信号,选择该频率周围的范围。
  2. 上通带边缘频率设置在中心频率的正上方,以便信号以最小的失真通过,大约在中心频率上方10%。
  3. 纹波的通带决定了带宽中允许的幅度变化. 对于高精度通信系统,选择约0.01-0.1dB的值。
  4. 阻带衰减(臂架频带中的衰减)表示臂架频带中的噪声抑制水平。 为了使我们的噪声可以忽略不计,衰减必须至少为60dB。

这些值是指示性的,可以根据信号要求、滤波器类型和实现特性进行调整。

接下来,我们将设置初始化模拟滤波器设计模块的各种变化的代价,但在此之前,我们将分析该模块的关键参数。

模拟滤波器设计

滤波器设计方法如下。

  1. Butterworth-Butterworth滤波器的幅频响应具有最大平坦带宽,并且通常是单调的。
  2. 切比雪夫I—第一种切比雪夫滤波器的幅度-频率响应在通带中具有均匀的脉动,在延迟带中是单调的。
  3. 切比雪夫II—第二种切比雪夫滤波器的幅度-频率响应在通带中是单调的,并且在延迟带中具有均匀的脉动。
  4. 椭圆-椭圆滤波器的幅频响应在通带和延迟带中都具有均匀的波纹。
  5. 贝塞尔-贝塞尔滤波器的幅频响应具有最大平坦带宽,通常是单调的。 滤波器具有最大平坦的线性相位-频率响应。

频率响应类型:

  1. 低通-低通滤波器。
  2. 高通-高通滤波器。
  3. 带通-带通滤波器。
  4. 带阻陷波滤波器。
In [ ]:
Lower_Frequency = 565486.65
Upper_frequency = 691150.35
Passband_ripple = 0.1
Stopband_attenuation = 60;

离散滤波器

接下来,我们将设置离散滤波器块的参数。 该单元用预设的数字IIR滤波器独立地对输入信号的每个通道进行滤波。

分析块本身,值得注意的是它可以实现几种滤波器结构。

直接表格I(Direct Form I)。

特点。
它使用两个独立的级联:一个用于实现分子多项式(前馈,∞),另一个用于分母多项式(反馈,∞)。
它包括两个延迟链:一个用于输入信号,另一个用于输出。

**优点。**概念简单,便于分析和设计。

缺点

  1. 大量的延迟寄存器。
  2. 实现高阶滤波器时数值稳定性较低。

直接表格II(直接表格II):

特点
直接形式I的优化版本。
结合分子和分母多项式的延迟寄存器,这减少了所需的内存。

优点
通过减少寄存器的数量来节省内存。

缺点
高滤波器阶数的实现中增加的数值不稳定性。

直接形式I转置(转置形式I)。

特点。 通过转置结构从直接形式I获得。 数据流被反转:输出变为输入,值的累积变为分布。

优点

  1. 在某些情况下,它具有改进的数值稳定性性质。
  2. 在一些硬件架构中实现起来比较方便。

缺点。 在寄存器总数方面类似于原始直接形式I。

直接形式II转置(Transposed Form II)。

特点。 通过转置直接形式II获得。

优点

  1. 它往往具有比标准直接形式II更好的数值稳定性。
  2. 便于在数字信号处理器(Dsp)中实现。

缺点。 它也受到高阶滤波器的数值不稳定性,但程度较小。

比较表:

|特性/直接形式I|*直接形式II|/*直接形式I转置|/直接形式II转置|
|----------------------------------|------------------------|-------------------------|-----------------------------|--------------------------------|
|延迟寄存器数|(N+M-2)|(\max(N,M)-1)|(N+M-2)|(\max(N,M)-1)/
/数值稳定性/中/低/中/高于直接形式II|
/内存消耗/高/低/高/低|
|易于实现/高/中/中/高|
/硬件兼容性/通用/通用/方便DSP/优化DSP|

结论:

  1. 直接形式II和直接形式II转置适用于内存资源有限的系统。
  2. 由于数值稳定性,直接形式I是低阶滤波器的首选。
  3. 换位形式通常更能抵抗数值误差,这使得它们对于高性能应用非常有用。

接下来,我们将使用数字滤波器编辑器应用程序来计算滤波器系数
image.png

我们每次都会设置不同的滤波器设计方法。 接下来,我们来看看每个滤波器的系数计算。
在此之前,我们将先前计算的边界频率值从rad/cb转换为Hz,并将值舍入为整数,以及找到信号的采样频率。
根据奈奎斯特定理,采样频率应该至少是信号最大频率的两倍,以避免混叠,并且考虑上界的裕量也是值得的。

混叠是在采样模拟信号时发生的现象,当采样频率不足以以以数字形式正确表示信号时。 这导致信号失真,因为信号的高频分量可以与较低的频率"合并",从而产生原始信号中不存在的虚假频率。

In [ ]:
Fcenter=round((Center_frequency/2π)/1000*2.3)
Flow=round((Lower_Frequency/2π)/1000)
Fup=round((Upper_frequency/2π)/1000)

println("采样率:△(Fcentr)kHz")
println("下限频率:∞(流量)kHz")
println("上限频率:∞(Fup)kHz")
Частота дискретизации: 230.0 кГц
Нижняя граничная частота: 90.0 кГц
Верхняя граничная частота: 110.0 кГц

下面是为滤波器之一生成系数的示例。 生成后,我们下载文件,然后使用它们来确定过滤器。

image.png

让我们通过声明解析函数从生成的TXT文件中提取系数。

In [ ]:
function read_coeff(path)
    # 阅读TXT
    txt = open(io->read(io, String), path)
    # 用逗号替换\n并将字符串包装在[]中
    data_str = "[" * replace(txt, "\n" => ",") * "]"
    # 将字符串转换为表达式
    parsed_expr = Meta.parse(data_str)
    # 我们执行表达式得到向量
    data_vector = eval(parsed_expr)
    return data_vector
end
Out[0]:
read_coeff (generic function with 1 method)
In [ ]:
# 阅读巴特沃斯的分子和分母
bat_num = read_coeff("$(@__DIR__)/coefficients/IIR_num_1.txt")
bat_denum = read_coeff("$(@__DIR__)/coefficients/IIR_denum_1.txt")
# 阅读切比雪夫的分子和分母1
che1_num = read_coeff("$(@__DIR__)/coefficients/IIR_num_1.txt")
che1_denum = read_coeff("$(@__DIR__)/coefficients/IIR_denum_1.txt")
# 阅读切比雪夫的分子和分母2
che2_num = read_coeff("$(@__DIR__)/coefficients/IIR_num_1.txt")
che2_denum = read_coeff("$(@__DIR__)/coefficients/IIR_denum_1.txt")
# 读取分子和椭圆分母
elp_num = read_coeff("$(@__DIR__)/coefficients/IIR_num_1.txt")
elp_denum = read_coeff("$(@__DIR__)/coefficients/IIR_denum_1.txt");

一阶滤波器

我们将在本演示中看到的下一个过滤器是一阶过滤器。 该单元实现了一个简单的高通或低通滤波器。 我们将设置其参数,前提是截止频率为120kHz。

In [ ]:
Fc = 120 # 截止频率
τ=1/2π*Fc; # 过滤时间常数

离散FIR滤波器

接下来,考虑离散FIR滤波器块。 为了实现它,我们还将使用数字滤波器编辑器应用程序和前面描述的系数解析功能。

要设置其他频率,我们将指定间隔为+-15%的间隔频率,以便它们落在前面描述的+-10%范围之外。

In [ ]:
println("新采样率:∞(Fcentr+5)kHz")
println("第二下限频率:∞(Flow-5)kHz")
println("第二上限频率:∞(Fup+5)kHz")
Новая частота дискретизации: 235.0 кГц
Вторая нижняя граничная частота: 85.0 кГц
Вторая верхняя граничная частота: 115.0 кГц
image.png
In [ ]:
fir_num = read_coeff("$(@__DIR__)/coefficients/fir_num.txt")

中值滤波器

接下来,我们将看这个演示中最简单的块,中值滤波器。

中值滤波器块针对每个通道独立地随时间计算输入信号的移动中值。 块使用滑动窗口的方法,我们唯一可以调整的参数就是过滤窗口本身。

In [ ]:
window = 15;

陷波-峰值滤波器

我们将考虑的最后一个块是陷波-峰值滤波器。 它使用预设的中心频率和3dB带宽按时间过滤输入信号的每个通道。 该模块提供可配置的滤波器设计参数,允许您在仿真期间分配滤波器特性。

我们在Q(Q因子)=10的条件下计算参数。

In [ ]:
Sample_rate = 1/Sample_Time 
Q = 10;
Fs=round((Center_frequency/2π))
BW = Fs/Q

println("Q=10时的带宽:≈(BW/1000)kHz")
println("信号的中心频率:∞(Fs/1000)kHz")
println("采样率:$(Sample_rate/1e6)MHz")
Ширина полосы при Q=10: 10.0 кГц
Центральная частота сигнала: 100.0 кГц
Частота дискретизации: 1.0 МГц

在开始模拟之前,再次确保声明了所有必要的变量。

In [ ]:
# 获取工作区中所有变量的列表
vars = names(Main, all=true)

# 输出数组和标量
for var in vars
    value = getfield(Main, var)
    if isa(value, AbstractArray)
        println("阵列: ", var, ",尺寸: ", size(value))
    elseif isa(value, Number) || isa(value, String)
        println("标量,标量: ", var, ",价值: ", value)
    end
end
Скаляр: BW, Значение: 10000.0
Скаляр: Fc, Значение: 120
Скаляр: Fcentr, Значение: 230.0
Скаляр: Flow, Значение: 90.0
Скаляр: Fs, Значение: 100000.0
Скаляр: Fup, Значение: 110.0
Скаляр: Lower_Frequency, Значение: 565486.65
Скаляр: Magnitude, Значение: 1
Скаляр: Noise_power, Значение: 1.0000000000000001e-7
Скаляр: Passband_ripple, Значение: 0.1
Скаляр: Phase, Значение: 0
Скаляр: Q, Значение: 10
Скаляр: Sample_Time, Значение: 1.0e-6
Скаляр: Sample_rate, Значение: 1.0e6
Скаляр: Signal_Amplitude, Значение: 1
Скаляр: Stopband_attenuation, Значение: 60
Скаляр: Upper_frequency, Значение: 691150.35
Массив: bat_denum, Размер: (21,)
Массив: bat_num, Размер: (21,)
Массив: che1_denum, Размер: (21,)
Массив: che1_num, Размер: (21,)
Массив: che2_denum, Размер: (21,)
Массив: che2_num, Размер: (21,)
Скаляр: data_str, Значение: [1.0,15.726465174717665,118.19779715124804,564.5945977782826,1922.5628210505968,4961.486649014338,10069.27911225147,16457.781390988064,22003.338138220104,24301.413576125095,22293.787678765948,17018.378514886626,10791.5437594143,5653.533013094259,2423.11034196715,836.6005210914026,227.22904721973316,46.794190857389,6.873719057490497,0.6421978090261691,0.028701721170992484]
Массив: data_vector, Размер: (21,)
Массив: elp_denum, Размер: (21,)
Массив: elp_num, Размер: (21,)
Массив: fir_denum, Размер: (11,)
Массив: fir_num, Размер: (11,)
Массив: preload_cells_startlog, Размер: (36,)
Скаляр: preloaded_cells_dir, Значение: /app/IJulia/preload_cells
Массив: preloaded_cells_names, Размер: (19,)
Скаляр: txt, Значение: 1.0
15.726465174717665
118.19779715124804
564.5945977782826
1922.5628210505968
4961.486649014338
10069.27911225147
16457.781390988064
22003.338138220104
24301.413576125095
22293.787678765948
17018.378514886626
10791.5437594143
5653.533013094259
2423.11034196715
836.6005210914026
227.22904721973316
46.794190857389
6.873719057490497
0.6421978090261691
0.028701721170992484
Массив: vars, Размер: (337,)
Скаляр: window, Значение: 15
Скаляр: τ, Значение: 19.098593171027442
Скаляр: Сenter_frequency, Значение: 628318.5

启动模型并分析结果

现在让我们继续测试所构建的电路,并根据滤波前后信号的频谱特性分析各种类型的滤波。 首先,我们将声明模型启动功能并运行模型以将仿真结果保存到Engee工作区。

启动模型

In [ ]:
# 启用辅助模型启动功能。
function run_model( name_model)
    
    Path = (@__DIR__) * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # 检查将模型加载到内核的条件
        model = engee.open( name_model ) # 打开模型
        model_output = engee.run( model, verbose=true ); # 启动模型
    else
        model = engee.load( Path, force=true ) # 上传模型
        model_output = engee.run( model, verbose=true ); # 启动模型
        engee.close( name_model, force=true ); # 关闭模型
    end
    sleep(5)
    return model_output
end

run_model("Comparative_analysis_of_filters")
Out[0]:
SimulationResult(
    "Analog Filter Design-11.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-11.1"),
    "Discrete Filter-3.1" => WorkspaceArray("Comparative_analysis_of_filters/Discrete Filter-3.1"),
    "inpNoise" => WorkspaceArray("Comparative_analysis_of_filters/inpNoise"),
    "Analog Filter Design-14.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-14.1"),
    "First-Order Filter-1.Out" => WorkspaceArray("Comparative_analysis_of_filters/First-Order Filter-1.Out"),
    "Analog Filter Design-4.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-4.1"),
    "Discrete Filter-2.1" => WorkspaceArray("Comparative_analysis_of_filters/Discrete Filter-2.1"),
    "Analog Filter Design.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design.1"),
    "Analog Filter Design-16.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-16.1"),
    "Analog Filter Design-15.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-15.1"),
    "Analog Filter Design-13.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-13.1"),
    "Analog Filter Design-1.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-1.1"),
    "Median Filter.1" => WorkspaceArray("Comparative_analysis_of_filters/Median Filter.1"),
    "Analog Filter Design-19.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-19.1"),
    "Analog Filter Design-7.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-7.1"),
    "Discrete Filter-1.1" => WorkspaceArray("Comparative_analysis_of_filters/Discrete Filter-1.1"),
    "Analog Filter Design-2.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-2.1"),
    "Analog Filter Design-10.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-10.1"),
    "Analog Filter Design-9.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-9.1"),
    "Discrete Filter.1" => WorkspaceArray("Comparative_analysis_of_filters/Discrete Filter.1"),
    "Analog Filter Design-18.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-18.1"),
    "inp" => WorkspaceArray("Comparative_analysis_of_filters/inp"),
    "Notch-Peak Filter.1" => WorkspaceArray("Comparative_analysis_of_filters/Notch-Peak Filter.1"),
    "Analog Filter Design-17.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-17.1"),
    "Analog Filter Design-12.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-12.1"),
    "Analog Filter Design-3.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-3.1"),
    "Analog Filter Design-6.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-6.1"),
    "First-Order Filter.Out" => WorkspaceArray("Comparative_analysis_of_filters/First-Order Filter.Out"),
    "Analog Filter Design-8.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-8.1"),
    "Analog Filter Design-5.1" => WorkspaceArray("Comparative_analysis_of_filters/Analog Filter Design-5.1")
)

结果分析

让我们从绘制原始信号的频谱开始。

In [ ]:
using FFTW
gr()
Out[0]:
Plots.GRBackend()
In [ ]:
inp = collect(simout["Comparative_analysis_of_filters/inp"]);
inp = inp.value;
inpNoise = collect(simout["Comparative_analysis_of_filters/inpNoise"]);
inpNoise = inpNoise.value;

plot(fftfreq(length(inp), Fs), abs.(fft(inp)./length(inp)), 
        label = "inp" , xguide="Frequency  / Hz", yguide="Magnitude")
plot!(fftfreq(length(inpNoise), Fs), abs.(fft(inpNoise)./length(inpNoise)), 
        label = "inpNoise" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

信号的主要频率,即100kHz,从噪声信号的频谱中清晰可见。

接下来,让我们比较所有的低通滤波器。

In [ ]:
Butterworth_lowpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design.1"]);
Butterworth_lowpass = Butterworth_lowpass.value;
plot(fftfreq(length(Butterworth_lowpass), Fs), abs.(fft(Butterworth_lowpass)./length(Butterworth_lowpass)), 
        label = "Butterworth_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev1_lowpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-4.1"]);
Chebyshev1_lowpass = Chebyshev1_lowpass.value;
plot!(fftfreq(length(Chebyshev1_lowpass), Fs), abs.(fft(Chebyshev1_lowpass)./length(Chebyshev1_lowpass)), 
        label = "Chebyshev1_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev2_lowpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-8.1"]);
Chebyshev2_lowpass = Chebyshev2_lowpass.value;
plot!(fftfreq(length(Chebyshev2_lowpass), Fs), abs.(fft(Chebyshev2_lowpass)./length(Chebyshev2_lowpass)), 
        label = "Chebyshev1_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Elliptic_lowpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-12.1"]);
Elliptic_lowpass = Elliptic_lowpass.value;
plot!(fftfreq(length(Elliptic_lowpass), Fs), abs.(fft(Elliptic_lowpass)./length(Elliptic_lowpass)), 
        label = "Elliptic_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Bessel_lowpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-16.1"]);
Bessel_lowpass = Bessel_lowpass.value;
plot!(fftfreq(length(Bessel_lowpass), Fs), abs.(fft(Bessel_lowpass)./length(Bessel_lowpass)), 
        label = "Bessel_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")

First_Order_lowpass = collect(simout["Comparative_analysis_of_filters/First-Order Filter.Out"]);
First_Order_lowpass = First_Order_lowpass.value;
plot!(fftfreq(length(First_Order_lowpass), Fs), abs.(fft(First_Order_lowpass)./length(First_Order_lowpass)), 
        label = "First_Order_lowpass" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

在这种情况下,低通滤波器降低了信号基频的幅度,这导致了有用信息的丢失。 这是因为滤波器只允许低频通过。 事实证明,100kHz的频率被切出,只剩下频率接近0Hz的组件。

低通滤波器通过频率低于某个阈值的信号,称为截止频率。 频率高于该阈值的所有信号分量将被抑制。 在这种情况下,滤波器切断了100kHz的频率,因为它超过了阈值,只留下非常低的频率(接近0Hz),这些频率与恒定分量或缓慢变化的信号相关联。 如果主信号具有高频率,例如,100kHz,这可能导致重要信息的丢失。

让我们继续讨论高频滤波器。

In [ ]:
Butterworth_highpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-1.1"]);
Butterworth_highpass = Butterworth_highpass.value;
plot(fftfreq(length(Butterworth_highpass), Fs), abs.(fft(Butterworth_highpass)./length(Butterworth_highpass)), 
        label = "Butterworth_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev1_highpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-5.1"]);
Chebyshev1_highpass = Chebyshev1_highpass.value;
plot!(fftfreq(length(Chebyshev1_highpass), Fs), abs.(fft(Chebyshev1_highpass)./length(Chebyshev1_highpass)), 
        label = "Chebyshev1_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev2_highpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-9.1"]);
Chebyshev2_highpass = Chebyshev2_highpass.value;
plot!(fftfreq(length(Chebyshev2_highpass), Fs), abs.(fft(Chebyshev2_highpass)./length(Chebyshev2_highpass)), 
        label = "Chebyshev1_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Elliptic_highpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-13.1"]);
Elliptic_highpass = Elliptic_highpass.value;
plot!(fftfreq(length(Elliptic_highpass), Fs), abs.(fft(Elliptic_highpass)./length(Elliptic_highpass)), 
        label = "Elliptic_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Bessel_highpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-17.1"]);
Bessel_highpass = Bessel_highpass.value;
plot!(fftfreq(length(Bessel_highpass), Fs), abs.(fft(Bessel_highpass)./length(Bessel_highpass)), 
        label = "Bessel_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")

First_Order_highpass = collect(simout["Comparative_analysis_of_filters/First-Order Filter-1.Out"]);
First_Order_highpass = First_Order_highpass.value;
plot!(fftfreq(length(First_Order_highpass), Fs), abs.(fft(First_Order_highpass)./length(First_Order_highpass)), 
        label = "First_Order_highpass" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

在这种情况下,高通滤波器不能有效地抑制频率低于100khz的信号分量,从而导致失真。 尽管频率为0Hz时的振幅高于100kHz,但滤波器跳过了超过截止阈值的所有频率。 此外,图上还可以看到两个振幅低于100khz的峰值,但这些峰值仍然很明显。

高通滤波器通过频率超过设定截止频率的信号。 频率低于该限值的信号分量将被抑制。 在这种情况下,滤波器截止频率低于100kHz,但图形上的其余峰值,即使其幅度低于100kHz,也可能由于以下几个原因而相当明显,这将在下面讨论。

噪声或干扰。 信号可能包含滤波器截止频率和100kHz频率之间的噪声或谐波。 这些峰值可能是由外部干扰或其它未被滤波器完全抑制的频率分量引起的。

  1. 系统的谐振频率。 在某些情况下,系统可能具有谐振频率,其中信号幅度被放大。 即使这些峰值与基频相比具有较低的幅度,如果它们与谐振频率或信号频谱的特征重合,它们也可以保持明显。

  2. 边框滤镜效果。 滤波器本身可能不是完美的,对于接近截止频率的频率,"半磁导率"可能会出现在截止边界处,这允许一些峰值保留下来,即使它们处于本应被抑制的频率范

因此,高通滤波器跳过100kHz以上的频率,留下可能由其他效应或信号特征引起的幅度峰值。

让我们来看看屏障条的过滤器。

In [ ]:
Butterworth_bandpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-2.1"]);
Butterworth_bandpass = Butterworth_bandpass.value;
plot(fftfreq(length(Butterworth_bandpass), Fs), abs.(fft(Butterworth_bandpass)./length(Butterworth_bandpass)), 
        label = "Butterworth_bandpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev1_bandpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-6.1"]);
Chebyshev1_bandpass = Chebyshev1_bandpass.value;
plot!(fftfreq(length(Chebyshev1_bandpass), Fs), abs.(fft(Chebyshev1_bandpass)./length(Chebyshev1_bandpass)), 
        label = "Chebyshev1_bandpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev2_bandpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-10.1"]);
Chebyshev2_bandpass = Chebyshev2_bandpass.value;
plot!(fftfreq(length(Chebyshev2_bandpass), Fs), abs.(fft(Chebyshev2_bandpass)./length(Chebyshev2_bandpass)), 
        label = "Chebyshev1_bandpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Elliptic_bandpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-14.1"]);
Elliptic_bandpass = Elliptic_bandpass.value;
plot!(fftfreq(length(Elliptic_bandpass), Fs), abs.(fft(Elliptic_bandpass)./length(Elliptic_bandpass)), 
        label = "Elliptic_bandpass" , xguide="Frequency  / Hz", yguide="Magnitude")

Bessel_bandpass = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-18.1"]);
Bessel_bandpass = Bessel_bandpass.value;
plot!(fftfreq(length(Bessel_bandpass), Fs), abs.(fft(Bessel_bandpass)./length(Bessel_bandpass)), 
        label = "Bessel_bandpass" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

这些滤波器在0Hz时也具有最大的信号幅度,而所有其他频率,包括对我们有用的100MHz频率,几乎完全被抑制。

景气带滤波器的设计是为了抑制一定范围的频率,使所有的东西都在这个范围之外。 在这种情况下,滤波器有效地阻止频率,包括100MHz,这对我们来说是一个重要的信号。 然而,在这种情况下,滤波器仅在接近0Hz的频率下传递信号,即低频分量(例如,恒定电压)。 禁止频带内的所有其他频率,包括有用频率和噪声,都被抑制。 如果信号的频率落在滤波器屏障的范围内,就像100mhz那样,这会导致有用信息的丢失。

让我们检查带宽过滤器。

In [ ]:
Butterworth_bandstop = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-3.1"]);
Butterworth_bandstop = Butterworth_bandstop.value;
plot(fftfreq(length(Butterworth_bandstop), Fs), abs.(fft(Butterworth_bandstop)./length(Butterworth_bandstop)), 
        label = "Butterworth_bandstop" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev1_bandstop = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-7.1"]);
Chebyshev1_bandstop = Chebyshev1_bandstop.value;
plot!(fftfreq(length(Chebyshev1_bandstop), Fs), abs.(fft(Chebyshev1_bandstop)./length(Chebyshev1_bandstop)), 
        label = "Chebyshev1_bandstop" , xguide="Frequency  / Hz", yguide="Magnitude")

Chebyshev2_bandstop = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-11.1"]);
Chebyshev2_bandstop = Chebyshev2_bandstop.value;
plot!(fftfreq(length(Chebyshev2_bandstop), Fs), abs.(fft(Chebyshev2_bandstop)./length(Chebyshev2_bandstop)), 
        label = "Chebyshev1_bandstop" , xguide="Frequency  / Hz", yguide="Magnitude")

Elliptic_bandstop = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-15.1"]);
Elliptic_bandstop = Elliptic_bandstop.value;
plot!(fftfreq(length(Elliptic_bandstop), Fs), abs.(fft(Elliptic_bandstop)./length(Elliptic_bandstop)), 
        label = "Elliptic_bandstop" , xguide="Frequency  / Hz", yguide="Magnitude")

Bessel_bandstop = collect(simout["Comparative_analysis_of_filters/Analog Filter Design-19.1"]);
Bessel_bandstop = Bessel_bandstop.value;
plot!(fftfreq(length(Bessel_bandstop), Fs), abs.(fft(Bessel_bandstop)./length(Bessel_bandstop)), 
        label = "Bessel_bandstop" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

带宽滤波器比以前的滤波器显示出更好的结果,因为图中有三个峰值突出:0hz时最高,100khz和-100khz时两个较低的峰值。

带通滤波器只允许特定频率范围内的信号通过,在给定频段内跳过它们并抑制所有其他信号。
在这种情况下,滤波器留下了三个主峰:第一个峰值在0Hz,它可以与信号的恒定分量或低频分量相关联,另外两个峰值在100kHz和-100kHz,它们代表有用的高频 这些峰值清晰可见,因为滤波器允许带宽内的频率通过,有效地消除了其他一切。

接下来,让我们继续分析离散滤波器块。

In [ ]:
Discrete_Butterworth = collect(simout["Comparative_analysis_of_filters/Discrete Filter-2.1"]);
Discrete_Butterworth = Discrete_Butterworth.value;
plot(fftfreq(length(Discrete_Butterworth), Fs), abs.(fft(Discrete_Butterworth)./length(Discrete_Butterworth)), 
        label = "Discrete_Butterworth" , xguide="Frequency  / Hz", yguide="Magnitude")

Discrete_Chebyshev1 = collect(simout["Comparative_analysis_of_filters/Discrete Filter-3.1"]);
Discrete_Chebyshev1 = Discrete_Chebyshev1.value;
plot!(fftfreq(length(Discrete_Chebyshev1), Fs), abs.(fft(Discrete_Chebyshev1)./length(Discrete_Chebyshev1)), 
        label = "Discrete_Chebyshev1" , xguide="Frequency  / Hz", yguide="Magnitude")

Discrete_Chebyshev2 = collect(simout["Comparative_analysis_of_filters/Discrete Filter-1.1"]);
Discrete_Chebyshev2 = Discrete_Chebyshev2.value;
plot!(fftfreq(length(Discrete_Chebyshev2), Fs), abs.(fft(Discrete_Chebyshev2)./length(Discrete_Chebyshev2)), 
        label = "Discrete_Chebyshev2" , xguide="Frequency  / Hz", yguide="Magnitude")

Discrete_Elliptic = collect(simout["Comparative_analysis_of_filters/Discrete Filter.1"]);
Discrete_Elliptic = Discrete_Elliptic.value;
plot!(fftfreq(length(Discrete_Elliptic), Fs), abs.(fft(Discrete_Elliptic)./length(Discrete_Elliptic)), 
        label = "Discrete_Elliptic" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

现在让我们继续分析离散滤波器块:Discrete_Butterworth,Discrete_Chebyshev1,Discrete_Chebyshev2和Discrete_Elliptic。 这些滤波器显示出迄今为止最差的结果,这很可能是由于不正确地设置过滤系数。 该图显示了46kHz处的明显峰值,而所有其他峰值位于大致相同的水平。

Butterworth、Chebyshev和Elliptic等离散滤波器在频率响应方面各有特点。 然而,如果滤波系数设置不正确,则它们可能不能有效地执行滤波任务,这导致较差的结果。 在这种情况下,46kHz峰值尤为明显,这可能意味着滤波器无法正确抑制该频域中的分量。 位于同一水平的其余峰值指示滤波器的选择性不足,这可能是由于滤波参数的不正确选择,例如截止频率或滤波器顺序。

现在让我们分析平均滤波器。

In [ ]:
Median_Filter = collect(simout["Comparative_analysis_of_filters/Median Filter.1"]);
Median_Filter = Median_Filter.value;
plot(fftfreq(length(Median_Filter), Fs), abs.(fft(Median_Filter)./length(Median_Filter)), 
        label = "Median_Filter" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

平均滤波器失败,因为所选窗口大小(15)证明太大而不能有效地去除干扰。 只是这个过滤器不适合这样的任务。 该图还显示了0Hz处的明亮峰值。

平均滤波器通过平滑信号来工作,这减少了随机波动,但它可能对去除高频干扰无效,特别是如果滤波器窗口太大。 在这种情况下,窗口15的尺寸证明太大,这使得无法去除干扰,特别是在高频下。 此外,平均滤波器没有设计成精确地过滤窄带或高频信号,这使得它不适合这样的任务。 0Hz处的亮峰值可能表明滤波器无法有效抑制信号的恒定或低频分量。

接下来,我们将分析FIR滤波器。

In [ ]:
FIR = collect(simout["Comparative_analysis_of_filters/Discrete Filter-1.1"]);
FIR = FIR.value;
plot(fftfreq(length(FIR), Fs), abs.(fft(FIR)./length(FIR)), 
        label = "FIR" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

对于FIR滤波器,上面针对离散滤波器块得出的结论是有效的。

现在让我们构建陷波峰滤波器块的频谱。

In [ ]:
Notch = collect(simout["Comparative_analysis_of_filters/Notch-Peak Filter.1"]);
Notch = Notch.value;
plot(fftfreq(length(Notch), Fs), abs.(fft(Notch)./length(Notch)), 
        label = "Notch" , xguide="Frequency  / Hz", yguide="Magnitude")
Out[0]:

陷波峰滤波块在本实验中显示出最佳结果。

具有参数Q=10的势垒带滤波器使得能够在100kHz中心频率附近的10.0kHz宽带中有效地隔离信号。 通过这种设置,滤波器能够以100kHz的频率隔离和放大信号分量,如图所示。 0Hz处的峰值虽然不太明显,但可能表明存在低频分量,例如,恒定信号分量。 尽管它的振幅很小,但滤波器有效地去除了其他频率,只留下100khz的必要峰值。

结论

我们检查了用于解决这个问题的滤波器,发现最合适的是具有Q=10参数的陷波峰滤波器,这使我们能够以最小的数据丢失保存100kHz的有用信号分量。

由于过滤系数的不正确调整或任务的过滤器类型的不正确选择,大多数其他过滤器没有显示出足够的效率。 建议对设置滤波器参数进行额外的实验,特别是对于离散滤波器和带宽滤波器,以优化它们的操作以完成这项任务。

该演示证明了微调滤波器和选择适当的滤波器类型以保留信号中有用信息的重要性。