Spectral classifier¶
This example shows a spectral classifier model. This model, developed at Engee, demonstrates the use of a block and mask system to implement digital signal processing algorithms. signal processing algorithms. This approach allows efficient processing and analysis of data, providing flexibility and convenience in the design of complex systems.
Spectral classifier is used to extract and identify the frequency components of a signal, which is a key element in recognising and analysing different types of signals. signals. In this example, the signal is speech.
By varying the parameters - bandwidths and thresholds values - you can adapt the algorithm to specific requirements, increasing the accuracy of the result. the accuracy of the results.
The realised model is shown in the figure below.
Auxiliary functions¶
# Подключение вспомогательной функции запуска модели.
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
Running the model and analysing the results¶
Let's listen to the input signal and analyse its spectrum.
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")
This audio contains a speech recording. The useful frequencies are located within 1 MHz. Let's try to classify them using our model. First of all, let's set the settings of our unit.
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);
Now let's run the model and analyse the results.
run_model("simple_classifier") # Запуск модели.
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")
As we can see, the signal has been extracted regions that meet the spectral characteristics set in the settings of the mask of our block.
Conclusion¶
In this example, the model spectral classifier model and the possibilities of its application to audio signal processing.