Engee 文档
Notebook

使用Engee函数的AGC模型

AGC(Automatic Gain Control,自动增益控制)
是一种在通信系统中控制信号电平的方法,其主要目的
是保持稳定水平。
输入信号的振幅变化时输出信号。

AGC使用示例

  1. 在收音机中,它有助于稳定音量
    与接收信号的强度无关。
  2. 在音频系统中保持恒定的录音水平
    即使在声源的音量突然变化。

因此,AGC提供舒适和高品质
各种条件下的信号的接收/再现。
我们实现的模型如下所示。

image.png

该模型有一个Engee功能块,它实现了用于
计算该函数中的增益。 包络变量是MATLAB常量变量(persistent)的模拟。 它是本地的
到在其中创建它的函数,但它不是在每个复位
计算步骤,而是存储前一个值,即存储
函数调用之间的内存中。

让我们仔细看看这个特性的实现。

  1. 块体结构

块是继承的结构
来自AbstractCausalComponent。 它包含一个字段
一个Float64信封,用于
来存储信号的包络的值。
Block()构造函数本身初始化
具有初始值的新块对象
包络值为0。

image.png
  1. 调用函数

这是我们算法的主要功能。 它
需要三个参数:t(时间),level(级别)和loudness(音量)。

如果包络的值小于0.08,则将envelope_gain设置为0.08。
否则,使用包络的当前值。

函数返回响度值除以envelope_gain,
哪个是最终的增益值
在特定的计算步骤。
image.png

  1. 更新功能!

此函数更新对象中信封的值。
块。 它计算包络的电平与当前值之间的差。
如果差异是正的,包络增加80%
差异。 否则,它减少了这个差异的1%。 结果是
,函数返回更新后的Block对象,允许
我们在每个计算步骤中存储并重新定义这个值。
image_2.png

现在我们已经决定了模型的组织,让我们继续启动它并分析结果。

辅助功能

In [ ]:
using WAV;
using .EngeeDSP;

function audioplayer(patch, Samples_per_audio_channel);
    s, fs = wavread(patch); 
    buf = IOBuffer();
    wavwrite(s, buf; Fs=fs);
    data = base64encode(unsafe_string(pointer(buf.data), buf.size));
    display("text/html", """<audio controls="controls" {autoplay}>
    <source src="data:audio/wav;base64,$data" type="audio/wav" />
    Your browser does not support the audio element.
    </audio>""");
    return s
end

# Подключение вспомогательной функции запуска модели.
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
Out[0]:
run_model (generic function with 1 method)

启动和分析模型

In [ ]:
run_model("agc_code") # Запуск модели.
Building...
Progress 0%
Progress 0%
Progress 6%
Progress 6%
Progress 13%
Progress 13%
Progress 18%
Progress 18%
Progress 23%
Progress 23%
Progress 29%
Progress 29%
Progress 34%
Progress 34%
Progress 40%
Progress 40%
Progress 45%
Progress 45%
Progress 50%
Progress 50%
Progress 56%
Progress 56%
Progress 61%
Progress 61%
Progress 66%
Progress 66%
Progress 72%
Progress 72%
Progress 77%
Progress 77%
Progress 83%
Progress 83%
Progress 88%
Progress 88%
Progress 94%
Progress 94%
Progress 99%
Progress 99%
Progress 100%
Progress 100%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "Out" => WorkspaceArray("agc_code/Out"),
    "inp" => WorkspaceArray("agc_code/inp")
)

让我们在模型的输入和输出处比较第一个通道的帧之一。

In [ ]:
inp = collect(simout["agc_code/inp"])
inp = inp.value[10,1]
out = collect(simout["agc_code/Out"])
out = out.value[10,1]

plot([inp[:,1],out[:,1]], label=["input data" "output data"])
Out[0]:

正如我们所看到的,输出信号的幅度在这个
帧明显低于输入信号的幅度。,
这向我们展示了我们的功能的正确操作。

现在让我们听两个音轨。

In [ ]:
audioplayer("$(@__DIR__)/speech_fade_48kHz.wav", 256);
In [ ]:
audioplayer("$(@__DIR__)/out_48kHz.wav", 256);

结论

从这个例子中我们可以看到,我们的自动调整信号增益的算法工作正常。