多相采样率转换器¶
本例展示了 FIR 速率转换模块的应用。 该程序块利用多相 采样率转换。 使用有理系数 L/M
该模块将输入信号的每一列 将输入信号的每一列作为一个单独的通道,并对其中的数据进行独立的超采样。 数据。
现在让我们来看看模型本身。 就是为这个例子开发的。它生成一个复信号 对其进行多相采样频率变换。
辅助功能¶
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
using FFTW
# Расчёт спектра сигнала
function compute_spectrum(signal, fs)
n = length(signal)
spectrum = abs.(fft(signal)) / n
freqs = (0:n-1) .* (fs / n)
spectrum[1:Int(n/2)], freqs[1:Int(n/2)] # Вернуть половину спектра (для удобства)
end
Out[0]:
运行模型并分析计算结果¶
在本例中,滤波器系数将取自为该模型预先录制的 MAT 文件。
In [ ]:
using MAT
# Чтение данных из .mat файла
file = matopen("$(@__DIR__)/Hm.mat")
var_names = names(file)
print("$var_names")
for var_name in var_names
value = read(file, var_name)# Получаем значение переменной из файла
@eval $(Symbol(var_name)) = $value # Динамическое создание переменной с именем var_name
end
# Закрытие файла
close(file)
In [ ]:
run_model("Rate_Conversion") # Запуск модели.
Out[0]:
现在让我们比较一下输入和输出数据。
In [ ]:
inp = collect(simout["dat2CDfix/inp"])
sim_time = vcat([m[] for m in inp.time]...) # Извлекаем значения из матриц
inp = vcat([m[] for m in inp.value]...) # Извлекаем значения из матриц
out = collect(simout["dat2CDfix/out"])
out = vcat([vec(m2) for m2 in out.value]...) # Преобразуем каждую матрицу в вектор
println("Кол-во входных залогированных данных: $(length(inp))")
print("Кол-во выходных залогированных данных: $(length(out))")
我们可以看到,输出的记录值是输入的两倍。 两倍。这表明,插值是提高信号采样率的过程。 插值 - 通过在现有采样之间添加新的采样来提高信号采样率的过程。 在现有采样之间添加新的采样。
In [ ]:
gr()
A = plot(real(inp[1:1000]), imag(inp[1:1000]), seriestype=:scatter, legend=false,
xlabel="Re", ylabel="Im", title="Вход")
B = plot(real(out[1:1000]), imag(out[1:1000]), seriestype=:scatter, legend=false,
xlabel="Re", ylabel="Im", title="Выход")
plot(A,B)
Out[0]:
从数据可视化的结果可以看出 输出端数值分布的振幅与输入端数值的振幅明显不同。 与输入值有很大差异。
现在我们来看看输入和输出的频谱比较结果。
In [ ]:
spectrum_inp, freqs_inp = compute_spectrum(inp[1:4000], 1000)
spectrum_out, freqs_out = compute_spectrum(out[1:4000], 1000)
plot(
plot(freqs_inp, spectrum_inp, xlabel="Frequency (Hz)", ylabel="Amplitude", title="Вход", label=""),
plot(freqs_out, spectrum_out, xlabel="Frequency (Hz)", ylabel="Amplitude", title="Выход", label="")
)
Out[0]:
对比结果显示,信号频谱明显失真。 根据频谱分析的结果,转换后的有用信号已经丢失。 频谱分析结果的有用信号丢失了。
结论¶
在本演示中,我们了解了多相转换器 采样率转换器及其在改变信号采样率方面的潜在应用。 多相转换器可以改变信号的采样率。该选项对您的项目非常有用。