Engee 文档
Notebook

光谱分类器

该示例展示了光谱分类器模型。 该模型由 Engee 开发,展示了使用 块和掩码系统来实现数字信号处理算法。 信号处理算法。这种方法可以高效地处理和分析数据 数据,为复杂系统的设计提供灵活性和便利性。

**光谱分类器 用于提取和识别信号的频率成分、 这是识别和分析不同类型信号的关键因素。 信号。在本例中,信号是语音。

通过改变参数(带宽和阈值 值,就能使算法适应特定要求,从而提高结果的准确性。 结果的准确性。

实现的模型如下图所示。 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

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
Out[0]:
audioplayer (generic function with 1 method)

运行模型并分析结果

让我们聆听输入信号并分析其频谱。

In [ ]:
signal = audioplayer("$(@__DIR__)/speech_dft_8k.wav", 256);
gr()
spectrum_inp, freqs_inp = compute_spectrum(signal, 8000)
plot(freqs_inp, spectrum_inp, xlabel="Frequency (Hz)", ylabel="Amplitude")
Out[0]:

这段音频包含一段语音录音。有用的频率位于 1 MHz 范围内。 让我们尝试使用我们的模型对它们进行分类。 首先,让我们对设备进行设置。

In [ ]:
fs = 8000; # Частота дискретизации
framesize = 2048; # Размер сегмента анализа
nfft = 1024; # Размер FFT
df = fs/nfft; # Ширина бина FFT
f1 = 200; # Нижняя граница первой полосы (Гц)
f2 = 1900; # Верхняя граница первой полосы (Гц)
f3 = 2000; # Нижняя граница второй полосы (Гц)
f4 = 3500; # Верхняя граница второй полосы (Гц)
indx1 = round(Int,f1/df); # Индексы в массиве выходных данных FFT
indx2 = round(Int,f2/df);
indx3 = round(Int,f3/df);
indx4 = round(Int,f4/df);

现在,让我们运行模型并分析结果。

In [ ]:
run_model("simple_classifier") # Запуск модели.
Building...
Progress 0%
Progress 0%
Progress 11%
Progress 11%
Progress 22%
Progress 22%
Progress 32%
Progress 32%
Progress 41%
Progress 41%
Progress 50%
Progress 50%
Progress 60%
Progress 60%
Progress 70%
Progress 70%
Progress 79%
Progress 79%
Progress 89%
Progress 89%
Progress 99%
Progress 99%
Progress 100%
Progress 100%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "Discriminator" => WorkspaceArray("simple_classifier/V/Discriminator"),
    "Speech" => WorkspaceArray("simple_classifier/V/Speech"),
    "V/UV" => WorkspaceArray("simple_classifier/V/V/UV")
)
In [ ]:
Speech = collect(simout["simple_classifier/V/Speech"])
V_on_UV = collect(simout["simple_classifier/V/V/UV"])

plot(V_on_UV.time, V_on_UV.value, seriestype=:steppost, label="V/UV")
plot!(Speech.time, Speech.value, label="signal")
Out[0]:

我们可以看到,信号已被提取出来 区域符合 特征的区域。 的区域。

输出

在本例中,模型 光谱分类器模型及其应用于音频信号处理的可能性 应用于音频信号处理的可能性。