Документация Engee
Notebook

Полифазный преобразователь частоты дискретизации

В данном примере разобрано применение блока FIR Rate Conversion. Этот блок выполняет эффективное полифазное преобразование частоты дискретизации с использованием рационального коэффициента L/M вдоль первого измерения.

Блок рассматривает каждый столбец входного сигнала как отдельный канал и передискретизирует данные в них независимо друг от друга.

Теперь давайте рассмотрим саму модель, разработанную для этого примера. В ней генерируется комплексный сигнал, к которому применяется полифазное преобразование частоты дискретизации.

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(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]:
compute_spectrum (generic function with 1 method)

Запуск модели и анализ расчёта

В данном примере коэффициенты фильтров будут взяты из 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)
["Hm3_Numerator", "Hm1_Numerator", "Hm2_Numerator"]
In [ ]:
run_model("Rate_Conversion") # Запуск модели.
Building...
Progress 0%
Progress 6%
Progress 15%
Progress 23%
Progress 31%
Progress 40%
Progress 47%
Progress 55%
Progress 63%
Progress 70%
Progress 79%
Progress 87%
Progress 93%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "out" => WorkspaceArray("dat2CDfix/out"),
    "inp" => WorkspaceArray("dat2CDfix/inp")
)

Теперь сравним входные и выходные данные.

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))")
Кол-во входных залогированных данных: 8001
Кол-во выходных залогированных данных: 16002

Как мы видим, на выходе залогировано в 2 раза больше значений, чем на входе. Это свидетельствует, о том, что была произведена интерполяция – процесс увеличения частоты дискретизации сигнала путем добавления новых отсчетов между существующими.

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]:

Это сравнение показало, что спектр сигнала значительно исказился, и полезный сигнал после преобразований, исходя из результатов спектрального анализа, утерян.

Вывод

В данной демонстрации мы рассмотрели полифазный преобразователь частоты дискретизации и возможности его применения для изменения частоты дискретизации сигнала. Эта опция будет очень полезной для ваших проектов.