AnyMath 文档
Notebook

二元频率操纵系统的设计和建模

本文讨论了使用二进制频移键控(Bfsk)**开发和建模数据传输系统的过程。 FSK调制是现代通信系统中的一个基本概念。 在其二进制版本中,逻辑"0"和"1"对应于频率为(f_1)和(f_2)的两个不同谐波信号。 BFSK因其抗噪性和易于实现而广泛应用于低速应用中,例如,在早期阶段的蓝牙,GSM技术以及各种遥测和无线电控制系统中。

在本文中,我们将开发一个与BFSK通信系统的模型,我们将经历以下阶段:

  1. 原始数字信号的生成。
  2. **BFSK调制:**通过根据比特选择两个载波频率之一来产生信号。
  3. **Bfsk解调:**实现非相干检测方法。 它基于使用带通滤波器将信号分成两个频率通道,分离它们的包络,并决定有利于包络幅度更大的通道。
  4. **结果分析:**传输和接收的消息的比较。

我们工作的一个特殊功能是在解调器中使用双二阶滤波器**(Biquad Filter)**的级联。 为了正确隔离BFSK信号的信息分量,必须确保滤波器精确调谐到调制器中使用的频率。 为此,我们对它们的幅度频率(AFC)和相位频率(FCH)特性进行了分析。

In [ ]:
using JLD2, Plots
SOS = load("filter_matrix.jld2", "SOS")
Scale = load("filter_matrix.jld2", "Scale")
println("Size SOS: $(size(SOS))")
println("Size Scale: $(size(Scale))")
Size SOS: (15, 6)
Size Scale: (16, 1)

滤波器系数已预先计算并保存到文件中。 filter_matrix.jld2. 加载了两个关键变量:

-**Sos(二阶段)**是每个双精度链路的系数矩阵。 矩阵尺寸 (15, 6) 这意味着滤波器由15个顺序连接的双夸特链路组成,每个链路由六个系数描述。
-Scale是每个链接的缩放系数的向量。 大小 (16, 1) 表示除了15个链接之外,还添加了一个额外的缩放因子。

这样的结构(biquadrate链接的级联)是实现提供数值稳定性的高阶滤波器的标准方式。

频率响应计算功能

该函数实现级联滤波器复透射系数的计算。:

-从给定范围为每个频率计算归一化角频率。 omega

-一个复杂的变量 z = exp(1im * omega) 对应于Z平面中单位圆上的一个点

-对于每个环节,其传递函数的形式计算:

$ $H_i(z)=\frac{b_0+b_1z{-1}+b_2z{-2}}{a_0+a_1z{-1}+a_2z{-2}}

In [ ]:
function biquad_freq_response(SOS, Scale, freqs, fs)
    n_sections = size(SOS, 1)
    n_freqs = length(freqs)
    H = ones(ComplexF64, n_freqs)
    
    for i in 1:n_sections
        b0, b1, b2, a0, a1, a2 = SOS[i, :]
        for j in 1:n_freqs
            omega = 2π * freqs[j] / fs
            z = exp(1im * omega)
            H_section = (b0 + b1/z + b2/z^2) / (a0 + a1/z + a2/z^2)
            H[j] *= H_section
        end
    end
    H .*= prod(Scale)
    return H
end
Out[0]:
biquad_freq_response (generic function with 1 method)

计算是针对从0到24MHz(48MHz采样频率的一半)的频率执行的,分辨率为1024点。

In [ ]:
Scale_vec = vec(Scale)
fs = 48000000
n_freqs = 1024
freqs = range(0, fs/2, length=n_freqs)

H = biquad_freq_response(SOS, Scale_vec, freqs, fs)
magnitude = 20*log10.(abs.(H))
phase = rad2deg.(angle.(H))
display(plot(freqs, magnitude, xlabel="频率(Hz)", ylabel="振幅(dB)", title="滤波器频率响应"))
display(plot(freqs, phase, xlabel="频率(Hz)", ylabel="相位(度)", title="滤波器的频率响应"))

从这些图表中可以得出几个结论:

  1. **高带外抑制:**频率响应值在带宽外迅速下降。 这表明滤波器的优异选择性-目标以外频率的信号几乎完全被抑制。

  2. **频带中的零衰减:**在频率响应峰值处,该值接近0dB(约10⁻〇dB),这意味着有用信号几乎没有衰减地通过。

  3. **相移非线性:**在通带中观察到复杂的相位行为,这是高阶滤波器的典型特征。 这将导致信号的一些相位失真,但是对于非相干检测,其中仅分析包络的幅度,相位失真不是关键的。

image.png

Bfsk信号的解调(块 FSK Demodulator),实现基于带通滤波器的非相干检测器。 该方法不需要载波相位的精确知识,这简化了实现。

解调器的算法由以下步骤组成:

  1. 输入BFSK信号并行应用于两个乘法器(乘积)。
  2. 在不同频率下形成两个平行通道:
    *在上声道中,信号乘以频率为"1"的参考振荡(Carrier Mark Freq1). 乘法的结果包含低频分量(与相位差的余弦成比例)和高频谐波。
    *在下通道中,信号乘以频率为"0"的参考振荡(Carrier Space Freq1
  3. 来自乘法器输出的信号被发送到相同的带通滤波器Biquad FilterBiquad Filter-1). 这些过滤器起着关键作用。:
    *它们抑制乘法过程中发生的高频分量。
    *他们的带宽被配置在这样一种方式,以便准确地分配对应于信道的频率。 实际上,每个滤波器作为包络检测器工作。 在滤波器输出端,我们收到一个信号,其幅度与滤波器设置频率下输入信号的幅度成比例。
  4. 增益与比较:
    *滤波后的信号用不同的增益系数放大,以补偿损耗,使其达到便于比较的范围。
    *接下来,信号被发送到减法器。
  5. 得到的差信号施加到控制端口 Switch.
    *如果差异是 > 0 (通道"1"中的能量大于通道"0"中的能量),键将值"1"传递给输出。
    *否则,如果差异是 < 0,一个"0"被施加到输出。
  6. 这样产生的数字信号(Demodulated Signal)对应于原始发送序列。

接下来,运行模型。

image.png
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(0.1)
    return model_output
end
run_model("Binary_FSK") 
Building...
Progress 0%
Progress 9%
Progress 45%
Progress 85%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 21,
    "FSK Demodulator.Demodulated Signal" => WorkspaceArray{Vector{Bool}}("Binary_FSK/FSK Demodulator.Demodulated Signal")
,
    "Signal From Workspace.1" => WorkspaceArray{Vector{Bool}}("Binary_FSK/Signal From Workspace.1")
,
    "FSK Modulator.Modulated Signal" => WorkspaceArray{Vector{Float64}}("Binary_FSK/FSK Modulator.Modulated Signal")
,
    "Add.1" => WorkspaceArray{Vector{Float64}}("Binary_FSK/FSK Demodulator/Add.1")

)

现在让我们依次提取仿真结果。:

*输入_Signal-原始位集。
*调制_Signal生成的BFSK信号。
*filt_1_minus_filt_2是滤波器后的差值信号。
*解调的_Signal-恢复的数字信号。

In [ ]:
Input_Signal = (collect(simout["Binary_FSK/Signal From Workspace.1"]).value)
Input_Signal = [x for subvec in Input_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
Input_Signal: Bool[1, 0, 0, 1, 0]

BFSK调制器的工作原理非常简单,它就像一个受控开关。:

*数字信号被施加到调制器的输入 Digital Data (位的序列:0和1)。
*调制器包含两个谐波信号发生器(正弦波):

  • Carrier Mark Freq 产生具有对应于逻辑"1"的频率(标记频率)的信号。 在我们的模型中,这是频率(f_1),其周期适合每个时钟周期5次(样本=5)。
  • Carrier Space Freq 产生具有对应于逻辑"0"(空间频率)的频率的信号。 在我们的模型中,这是频率(f_2),其周期适合每个时钟周期50次(样本=50)。
    *控制信号 Digital Data 它被施加到开关的控制端口,并且在调制器的输出端产生BFSK信号,准备传输。
image.png

下面是我们的位序列的调制信号的曲线图。

In [ ]:
Modulated_Signal = (collect(simout["Binary_FSK/FSK Modulator.Modulated Signal"]).value)
Modulated_Signal = [x for subvec in Modulated_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
plot(Modulated_Signal)
Input_Signal: Bool[1, 0, 0, 1, 0]
Out[0]:

信号 filt_1_minus_filt_2 它表示解调器中信道"1"和"0"的滤波分量之间的差。 它的形状由以下因素决定:

  1. 切换位导致正负区域之间的急剧转换,对应于传输字符的变化。

  2. 滤波器的惯性(系统存储器)在每个开关后都会产生阻尼振荡,这可以通过滤波器的有限带宽来解释(从频率响应中可以看出)。

  3. 字符间干扰由于来自先前位的重叠响应而发生,这使波形复杂化。

主要的事情:对于解调,不是使用整个复杂的波形,而只是它的符号在门控的那一刻,它可以让你毫不含糊地恢复原来的位序列。

In [ ]:
filt_1_minus_filt_2 = (collect(simout["Binary_FSK/FSK Demodulator/Add.1"]).value)
filt_1_minus_filt_2 = [x for subvec in filt_1_minus_filt_2 for x in subvec]
println("Input_Signal: $Input_Signal")
plot(filt_1_minus_filt_2)
Input_Signal: Bool[1, 0, 0, 1, 0]
Out[0]:

正如我们所看到的,作为结果,输入组比特被正确解码。

In [ ]:
Demodulated_Signal = (collect(simout["Binary_FSK/FSK Demodulator.Demodulated Signal"]).value)
Demodulated_Signal = [x for subvec in Demodulated_Signal for x in subvec]
println("Input_Signal: $Input_Signal")
println("Demodulated_Signal: $(Demodulated_Signal[2:1100:end])")
display(plot(Demodulated_Signal))
Input_Signal: Bool[1, 0, 0, 1, 0]
Demodulated_Signal: Bool[1, 0, 0, 1, 0]

结论

由于所做的工作,成功地创建和测试了二进制频率操纵(BFSK)通信系统的仿真模型。 传输的比较([1, 0, 0, 1, 0])和接受的序列证实,所开发的解调方案在理想通信信道的条件下正确地恢复原始数据。 这一结果证实了所提出的架构的可操作性,该架构具有级联的双夸特滤波器和系统参数的正确选择,这是进一步使模型复杂化的基础,例如通过向通信信道添加噪声来评估抗扰度。