Добавил:
t.me Фулл всегда есть! А если нет, то Вы плохо его ищите! ИиКГ, СКДИКТ, ОКИТПЭС и тд https://t.me/whitedevil752 Так же веду разработку КД (конструкторской документации) согласно ГОСТ. Имеется опыт работы при производстве на одном из ведущих в области радиэлектроники предприятии. Пишите) Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
27.10.2025
Размер:
7 Кб
Скачать
%%% ЛР №2. Исследование импульсно-кодовых модуляций %%
clear all
close all
clc
disp('% ЛР №2. Исследование импульсно-кодовых модуляций') 

%%%  Входные данные  %%
load('abracadabra.mat')
Fs = 48e3;              % частота дискретизации (для MP3)
fc_LPH_TX = 4e3;        % частота среза ФНЧ передающего тракта
x_input = abracadabra;
N = length(x_input);
n = 0:N-1;
t = n/Fs;
%%% ---------------------------------------------------------------------------- %%
disp('% ♪ Исходный сигнал ♪') 
sound(x_input,Fs)                                  % воспроизведение сигнала
disp('% Для остановки воспроизведения нажмите <ENTER>') 
pause
clear sound

[S_x,f] = periodogram(x_input,[],N,Fs,'twosided'); % рассчёт периодограммы

figure
subplot(2,1,1)
    plot(t,x_input)
    xlabel('t, s')
    ylabel('x(t)')
    ylim([-1.05 1.05])
    grid on
subplot(2,1,2)
    semilogx(f,mag2db(S_x))
    xlabel('f, Hz')
    ylabel('S_x(f)')
    xlim([0 Fs/2])
    ylim([-150 0])
    grid on
sgtitle('Входной сигнал и его периодограмма')

disp('% Для продолжения нажмите <ENTER>')
pause

%%%  П1. ДИКМ: квантование разности между 2 отсчётами    %%
disp('% П1. ДИКМ: квантование разности между 2 отсчётами') 

%  Кодирование:
[b,a] = butter(10,fc_LPH_TX/(Fs/2),'low');  % рассчёт коэффициентов фильтра Баттерворта
x_filtered = filter(b,a,x_input);           % фильтрация до квантования
x_delayed = [0;x_filtered(1:end-1)];        % задержка сигнала
delta = x_filtered - x_delayed;             % разница между 2 отсчётами
max_delta = max(delta);                     % макс. значение 
delta_normalized = delta/max_delta;         % нормировка на макс. значение
m = 8;                                      % число бит квантования
d = 1/(2^(m-1));
partition = [-1:d:1-d];
codebook = [-1:d:1];
[~,delta_quantiz_1,distortion] = quantiz(delta_normalized,partition,codebook); % квантование дельты

%  Декодирование:
delta_output = delta_quantiz_1 * max_delta; % деквантование дельты
y = cumsum(delta_output);
[S_y,f] = periodogram(y,[],N,Fs,'twosided');

figure
plot(t,delta); hold on
plot(t,delta_quantiz_1*max_delta)
plot(t,delta_output)
grid on
legend('input','quantiz','output')
xlabel('t')
ylabel('Δ(t)')
title('дельта ДИКМ')

disp('% Добится max значения Δ ≤ 0.25') 
disp('% Для продолжения нажмите <ENTER>') 
pause

figure
subplot(2,1,1)
    plot(t,y)
    xlabel('t, s')
    ylabel('y(t)')
    ylim([-1.2 10])
    xlim([0 N/Fs])
    grid on
subplot(2,1,2)
    semilogx(f,mag2db(S_y))
    xlabel('f, Hz')
    ylabel('S_y(f)')
    xlim([0 Fs/2])
    ylim([-150 max(mag2db(S_y))])
    grid on
sgtitle('восстановленный сигнал и его периодограмма')

%  Фильтрация сигнала:
disp('% Фильтрация сигнала:')
disp('% синтезируйте АЧХ фильтра и экспортируйте коэффициенты')
disp('% сохраните коэффициенты SOS и G под именем filt_coef_1.mat')
clear b a
load('filt_coef_1.mat')
[b,a] = sos2tf(SOS,G);
y_output = filter(b,a,y);
[S_y,f] = periodogram(y_output,[],N,Fs,'twosided');

figure
subplot(3,1,1)
    plot(t,x_input); hold on
    plot(t,y_output)
    grid on
    xlabel('t')
    ylabel('x(t)')
    legend('input','output')
    title('входной и выходной сигналы')
    ylim([-1.05 1.05])
subplot(3,1,2)
    semilogx(f,mag2db(S_x)); hold on
    semilogx(f,mag2db(S_y))
    grid on
    xlabel('f, Hz')
    ylabel('S(f)')
    legend('input','output')
    title('их периодограммы')
    xlim([0 Fs/1e3])
    ylim([-150 0])
subplot(3,1,3)
    plot(t,delta)
    grid on
    xlabel('t')
    ylabel('Δ(t)')
    title('дельта при ДИКМ')
sgtitle('ДИКМ: квантование разности между 2 отсчётами')

disp('% Сделайте вывод об изменении качества звука и его причины')
disp('% ♪ Выходной сигнал ♪') 
sound(y_output,Fs)
disp('% Для остановки воспроизведения нажмите <ENTER>') 
pause
clear sound

disp('% Посчитайте мощность шумов квантования для ДИКМ (случай №1)') 
disp('% Для продолжения нажмите <ENTER>') 
pause

%%%  П2. ДИКМ: квантование разности между текщим и прошлым квантованнным отсчётом    %%
disp('% П2. ДИКМ: квантование разности между текщим и прошлым квантованнным отсчётом') 
disp('% 1) Написать код для реализации ДИКМ с декодером в кодере') 
disp('% 2) Выбрать частоту среза для фильтра на передающей стороне, чтобы обеспечить Δ ≤ 0.25') 
disp('% 3) Выбрать фильтр на приёмной стороне, чтобы убрать постоянную составляющую') 
disp('% 4) Построить графики входного и выходного сигналов и Δ') 
disp('% 5) Сделать вывод об изменении качества звука и его причины') 
disp('% 6) Посчитать мощность шумов квантования для ДИКМ (случай №2)') 

%%%  П3. Дельта модуляция    %%
disp('% П3. Дельта модуляция') 
disp('% 1) Написать код для реализации дельта модуляции') 
disp('% 2) Выбрать частоту среза для фильтра на передающей стороне, чтобы обеспечить Δ ≤ 0.125') 
disp('%    Если звучание выходного сигнала будет плохим, достичь Δ ≤ 0.0625') 
disp('% 3) Выбрать фильтр на приёмной стороне, чтобы убрать постоянную составляющую') 
disp('% 4) Построить графики входного и выходного сигналов и Δ') 
disp('% 5) Сделать вывод об изменении качества звука и его причины') 
disp('% 6) Посчитать мощность шумов квантования для дельта модуляции') 




Соседние файлы в папке вроде лр2, а может это и практика, абракадабра крч