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

Начало работы с цифровой обработкой сигналов (ЦОС) в Engee

Работа с функциями

Загрузка и визуализация сигнала

Функция using делает перечисленные модули доступными для пользователя, аналогично функции import на других языках:

Несколько выходных данных необязательно заключать в скобки как в MATLAB.
using DSP, WAV, Plots
plotly()

s, fs = wavread("/user/test.wav")

plot(0:1/fs:(length(s)-1)/fs, s)
Вывод

getting started dsp 1

Функция ниже принимает спектрограмму со стандартными параметрами для речи (окна Ханнинга 25 мс, перекрытие 10 мс), строит и возвращает спектрограмму:

S = spectrogram(s[:,1], convert(Int, 25e-3*fs), convert(Int, 10e-3*fs); window=hanning)
Plots.heatmap(S.time.*1000, S.freq, pow2db.(S.power), xguide = "Время, мс", yguide = "Частота, Гц")
Вывод

getting started dsp 2

Обработка сигнала

Теперь пропустим сигнал через фильтр, чтобы смоделировать полосу пропускания телефона, и снова построим его спектрограмму:

responsetype = Bandpass(300, 3400; fs=fs)
prototype = Butterworth(8)
telephone_filter = digitalfilter(responsetype, prototype)

Посмотрим на характеристику фильтра:

Переменные могут иметь имена Unicode. Это набирается как \omega + tab.
ω = 0:0.01:pi
H = freqz(telephone_filter, ω)

Фильтруем наш сигнал:

sf = filt(telephone_filter, s)

Sf = spectrogram(s[:,1], convert(Int, 25e-3*fs), convert(Int, 10e-3*fs); window=hanning)
Plots.heatmap(Sf.time.*1000, Sf.freq, pow2db.(Sf.power), xguide = "Время, мс", yguide = "Частота, Гц")
Вывод

getting started dsp 3

Воспроизведение результатов

using Base64

function audioplayer(filepath)
  markup = """<audio controls="controls" {autoplay}>
        <source src="$filepath" />
        Your browser does not support the audio element.
        </audio>"""

  display(MIME("text/html") ,markup)
 end

 function audioplayer(s, fs)
  buf = IOBuffer()
  wavwrite(s, buf; Fs=fs)
  data = base64encode(unsafe_string(pointer(buf.data), buf.size))
  markup = """<audio controls="controls" {autoplay}>
        <source src="data:audio/wav;base64,$data" type="audio/wav" />
        Your browser does not support the audio element.
        </audio>"""
  display(MIME("text/html") ,markup)
end

audioplayer(s, fs)
audioplayer(sf, fs)
Вывод

Передискретизация сигнала

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

Найдем коэффициенты интерполяции и децимации.

using Plots
using DSP

Fdat = 48e3;
Fcd = 44.1e3;
LM = Rational{Int32}(Fcd/Fdat);
L = LM.num;
M = LM.den;
(L,M)
Вывод
(147, 160)

Визуализируем исходный аудио сигнал:

t = 0:1/Fdat:0.25-1/Fdat;
x = sin.(2*pi*1.5e3*t);
gr()
plot(t, x, line=:stem, marker=:circle)
xlims!((0,0.001))
Вывод

getting started dsp 4

Сделаем передискретизацию и наложим полученный сигнал на исходный

f = (Fdat/2)*min(1/L,1/M)
win = DSP.Windows.kaiser(3579,3);
fir = DSP.Filters.digitalfilter(DSP.Filters.Lowpass(f/48e3),FIRWindow(win)).

xup = DSP.Filters.resample(x,Int64(L),fir);
y = L.*xup[1:M:end].

t_res = (0:(length(y)-1))/Fcd;
plot!(t_res, y, line=:stem, marker=:circle)
Вывод

getting started dsp 5