Основы цифровой обработки сигналов
Дискретные сигналы и теорема Котельникова
Знакомимся с параметрами дискретных периодических сигналов, основным условием теоремы Котельникова и эффектом алиасинга визуально и при помощи прослушивания аудио.
Создание дискретной синусоиды
Формируем вектор отсчётов времени на основе выбранной частоты дискретизации:
Частота_дискретизации = 100; # Гц
Период_дискретизации = 1/Частота_дискретизации; # сек
Шаг = Период_дискретизации; # сек
Вектор_времени = 0:Шаг:1 # сек
Создаём вектор отсчётов синусоидального сигнала с заданными параметрами:
Амплитуда = 2; # В
Фаза = pi/4; # рад
Основная_частота = 4; # Гц
# Создание вектора синусоидального сигнала:
Сигнал = Амплитуда * sin.(2pi * Основная_частота * Вектор_времени .+ Фаза)
Строим график дискретной синусоиды во времени:
plot(Вектор_времени, Сигнал, marker = :circle)
Изменение параметров дискретной синусоиды в масках кодовых ячеек:
Sampling_freq = 20 # @param {type:"slider",min:20,max:100,step:10}
Base_freq = 10 # @param {type:"slider",min:0,max:10,step:1}
ϕ = 90 # @param {type:"slider",min:0,max:360,step:10}
Amplitude = 1.4 # @param {type:"slider",min:0,max:2,step:0.1}
timestep = 1/Sampling_freq; # Sampling period
timevec = 0:timestep:1-timestep; # Time vector
my_sine = Amplitude .* sin.(2*pi*Base_freq*timevec .+ (2*pi*ϕ/360));
if Base_freq > 0
nsamp = Int(round(Sampling_freq/Base_freq));
else
nsamp = 0;
end
plot(timevec,my_sine, lw=2, m=:c, ylim = (-2.1,2.1), leg=:none)
plot!(timevec,my_sine, l=:stem)
annotate!(0.6, 1.8, "Отсчётов на период: $nsamp")
Создание пользовательского дискретного сигнала
Подключим файл с дополнительной функцией:
include("audioplayer.jl") # небольшая функция для прослушивания аудио
Запишем значения одного периода дискретного сигнала и размножим его 500 раз:
fs = 3000;
t = 0:1/fs:1 - 1/fs;
one_period = 0.84 .* [0.0, 1.0, 1.0, 0.0, -1.0, -1.0];
sig = repeat(one_period,500);
audioplayer(sig,fs)
plot(t[1:20],sig[1:20],l=:stem,m=:c)
Сравним сигнал с дискретной синусоидой частотой 500 Гц (частота дискретизации 15 кГц):
fs_big = 15000;
t_big = 0:1/fs_big:1-1/fs_big;
sine_500 = sin.(2*pi*500*t_big);
audioplayer(sine_500,fs_big)
plot(t_big[1:100],sine_500[1:100])
plot!(t[1:20],sig[1:20],l=:stem,m=:c)
Увеличение частоты дискретизации сигнала вдвое - мы замечаем удвоение основной частоты повторения и увеличение высоты тона на октаву:
audioplayer(sig,2fs)
plot(t_big[1:100],sine_500[1:100])
plot!(t[1:40]./2,sig[1:40],l=:stem,m=:c)
Выполнение условия теоремы Котельникова в пределе (аудио слышно с трудом):
cosine_1500 = cos.(2*pi*1500*t);
audioplayer(cosine_1500,fs)
plot(t[1:20],cosine_1500[1:20],m=:c,leg=false)
Несоблюдение условия теоремы Котельникова (основная частота 2700 Гц):
cosine_2700 = cos.(2*pi*2700*t);
audioplayer(cosine_2700,fs)
plot(t[1:20],cosine_2700[1:20],m=:c,leg=false)
Эффект алиасинга при понижении частоты дискретизации:
Рассмотрим влияние алиасинга, наложения дискретных отсчётов исходного сигнала на сигнал меньшей основной частоты при понижении частоты дискретизации до таких значений, когда условие теоремы Котельникова не выполняется, т.е. когда самая большая частота в спектре сигнала выходит за пределы .
Оценим эффект визуально и на слух на примере синусоидального тона с основной частотой в 2.5 кГц. Меняя значение частоты дискретизации при помощи слайдера, можно наблюдать изменение основной частоты тона при несоблюдении условия теоремы Котельникова. Начиная со значений Гц, тон начнёт понижаться:
Fs = 3000 # @param {type:"slider",min:3000,max:8000,step:500}
dt = 1/Fs;
T = 0:dt:1;
Fbase = 2500;
x = sin.(2*pi*Fbase*T);
audioplayer(x,Fs)
tbig = 0:(dt/10):1;
xbig = sin.(2*pi*Fbase*tbig);
nsamp = Int(ceil(0.0021/dt));
nsampbig = Int(ceil(0.0021/(0.1*dt)));
if Fbase > Fs/2
plot(T[1:nsamp], x[1:nsamp], legend=false, lw=3, l=:stem, xlim=(0,0.002), m=:c, ms=6)
plot!(tbig[1:nsampbig],xbig[1:nsampbig])
xsmall = sin.(2*pi*(Fs-Fbase)*tbig .+ pi);
plot!(tbig[1:nsampbig],xsmall[1:nsampbig],lw=3)
else
plot(T[1:nsamp], x[1:nsamp], legend=false, lw=3, l=:stem, xlim=(0,0.002), m=:c, ms=6)
plot!(tbig[1:nsampbig],xbig[1:nsampbig])
end