使用Engee函数的AGC模型
AGC(Automatic Gain Control,自动增益控制)
是一种在通信系统中控制信号电平的方法,其主要目的
是保持稳定水平。
输入信号的振幅变化时输出信号。
AGC使用示例
- 在收音机中,它有助于稳定音量
与接收信号的强度无关。 - 在音频系统中保持恒定的录音水平
即使在声源的音量突然变化。
因此,AGC提供舒适和高品质
各种条件下的信号的接收/再现。
我们实现的模型如下所示。
该模型有一个Engee功能块,它实现了用于
计算该函数中的增益。 包络变量是MATLAB常量变量(persistent)的模拟。 它是本地的
到在其中创建它的函数,但它不是在每个复位
计算步骤,而是存储前一个值,即存储
函数调用之间的内存中。
让我们仔细看看这个特性的实现。
- 块体结构
块是继承的结构
来自AbstractCausalComponent。 它包含一个字段
一个Float64信封,用于
来存储信号的包络的值。
Block()构造函数本身初始化
具有初始值的新块对象
包络值为0。
- 调用函数
这是我们算法的主要功能。 它
需要三个参数:t(时间),level(级别)和loudness(音量)。
如果包络的值小于0.08,则将envelope_gain设置为0.08。
否则,使用包络的当前值。
函数返回响度值除以envelope_gain,
哪个是最终的增益值
在特定的计算步骤。

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

现在我们已经决定了模型的组织,让我们继续启动它并分析结果。
辅助功能
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
启动和分析模型
run_model("agc_code") # Запуск модели.
让我们在模型的输入和输出处比较第一个通道的帧之一。
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"])
正如我们所看到的,输出信号的幅度在这个
帧明显低于输入信号的幅度。,
这向我们展示了我们的功能的正确操作。
现在让我们听两个音轨。
audioplayer("$(@__DIR__)/speech_fade_48kHz.wav", 256);
audioplayer("$(@__DIR__)/out_48kHz.wav", 256);
结论
从这个例子中我们可以看到,我们的自动调整信号增益的算法工作正常。