Импульсно- кодовая модуляция в Дифференциальную импульсно- кодовую модуляцию
30.12.2022
Доброго времени суток! Получил задание на разработку алгоритма и программы, реализующих преобразование ИКМ в ДИКМ(первого порядка).
1) Разработать методичку оценки сжатия;
2) Провести оценку степени сжатия для ДИКМ первого порядка.
Может ли ктонибудь, пожалуйста, помочь с программой в MATLAB, ибо я в этом совсем не знаток? Заранее спасибо!
Ответы
Начните с алгоритма.
1) Берем сигнал
2) Дискретизируем по теореме Котельникова
3) Выводим отсчеты в массив(Ui)
4) Делаем новый массив, где Yi=U(i+1)-Ui
5) Строим график по новому массиву
Я имел в виду то, как вы собираетесь преобразовывать ИКМ в ДИКМ.
Хотя я смотрю на задание и понимаю, что преобразовывать ничего не нужно, достаточно просто оценить потоки данных после ИКМ и ДИКМ по выбранному показателю, затем сравнить оценки. Тут бы еще понимать, что выступает в виде источника сигнала, его характеристики.
В документации Matlab'а есть пример по DPCM:
https://au.mathworks.com/help/comm/ug/differential-pulse-code-modulation.html
Посмотрел материал, ссылку на который вы дали, и, как я понял, там именно модулирование сигнала с помощью ДИКМ. А у меня нужно сначала в ИКМ, а потом уже этот сигнал в ДИКМ. Может быть, конечно, я что не так понял на сайте...
У меня есть программа, которая выполняет все до ИКМ, но как перевести уже этот ИКМ в ДИКМ я не знаю
clc;
clear all;
t = 0:0.0005:10;
% Сигнал
x = sin(t);
subplot(3,1,1);
plot(t,x,'black');
title('Сигнал');
xlabel('Время')
ylabel('Амлитуда')
grid on
% Квантование сигнала
partition = -1:0.1:1;
codebook = -1:0.1:(1+0.1);
[index,quants] = quantiz(x,partition,codebook);
subplot(3,1,2);
plot(t,quants);
title('Квантование сигнала');
xlabel('Отсчёты')
ylabel('Амплитуда')
grid on
% ИКМ сигнал
y = uencode(quants,3);
subplot(3,1,3);
plot(t,y,'red');
title('ИКМ сигнал');
xlabel('Отсчёты');
ylabel('Амплитуда')
grid on
Если воспользоваться примером Матлаба, то можно продолжить ваш пример.
%Дельта-модуляция с теми же параметрами, что и ИКМ
predictor = [0 1];
y2 = dpcmenco(x,codebook,partition,predictor);
%Демодуляция
y2dec = dpcmdeco(y2,codebook,predictor);
%Построение графика (посмотреть визуально качество демодуляции)
figure
plot(t,x,t,y2dec)
legend('Исходный сигнал','Сигнал после декодирования','Location','best');
%Количество бит, требуемое для передачи одного символа ИКМ сигнала
k1=ceil(log2(numel(unique(y))));
%Количество бит, требуемое для передачи одного символа ДИКМ сигнала
k2=ceil(log2(numel(unique(y2))));
%Сжатие сигнала ДИКМ относительно ИКМ
r=k1/k2;
В итоге сжатие равно 1.5
Преобразовывать ИКМ в ДИКМ не нужно.
Я понимаю, что в матлабе есть команды, чтоб и ИКМ, и ДИКМ получить, не преобразовывая одно в другое. Но по полученному мной заданию необходимо именно как-то преобразовать ИКМ в ДИКМ. Надеюсь, я вас правильно понял
Если приведете задание в оригинале, то можно подумать. Однако я все-таки сомневаюсь, что нужно преобразовывать ИКМ в ДИКМ.
Получил задание на разработку алгоритма и программы, реализующих преобразование ИКМ в ДИКМ(первого порядка).
1) Разработать методичку оценки сжатия;
2) Провести оценку степени сжатия для ДИКМ первого порядка.
То, что написано в самом начале, и есть оригинал.
Возможно неточность в самом задании. Я думаю лучше уточнить, что именно требуется. На мой взгляд логичнее преобразовать один и тот же сигнал, затем сравнить модулированные сигналы. А тут получается нужно пребобразовать сигнал в ИКМ, затем ИКМ в ДИКМ и сравнить выход ИКМ и выход ИКМ+ДИКМ. Хотя вроде бы особых технических сложностей тут не должно быть, восьмиуровневый сигнал преобразовать в ДИКМ, скроее всего результат будет аналогичный. Может завтра посмотрю. Поздно уже.
Согласен, что имеет место быть отсутствие логики, но такое задание. Буду очень благодарен, если сможете завтра.
После вашего кода можно вставить этот
%ДИКМ-кодирование сигнала y, прошедшего ИКМ модуляцию
partition1 = 0.5:1:6.5;
codebook1 = -3:4;
predictor1 = [0 1];
y2 = dpcmenco(y,codebook1,partition1,predictor1);
%Демодуляция
y2dec = dpcmdeco(y2,codebook1,predictor1);
%Построение графика, для визуальной оценки демодуляции
figure
plot(t,y,t,y2dec+3,'x')
legend('ИКМ сигнал','Сигнал после декодирования ИКМ+ДИКМ','Location','best');
%Количество бит, требуемое для передачи одного символа ИКМ сигнала
k1=ceil(log2(numel(unique(y))));
%Количество бит, требуемое для передачи одного символа ИКМ сигнала, перекодированного в ДИКМ
k2=ceil(log2(numel(unique(y2))));
%Сжатие сигнала ДИКМ относительно ИКМ
r=k1/k2;
Словарь сделан на уровне догадок, почему именно так работает не скажу, потому что сам не знаю. Ну и в демодулированном сигнале есть постоянный сдвиг "-3". Собственно при построении графика он компенсирован. Скорее всего этот результат кривой, но формально работает. А как именно должно быть (может даже так и должно быть, как получилось) это надо разбираться с алгоритмом ДИКМ.
Буду смотреть. Спасибо вам большое!
К сожалению, результат неудовлетворил того, кто это задание дал. Сказал, что реализовать тоже самое, но не использовать встроенные функции матлаба, а реализовать всё поэтапно. Да и сделать ещё эти махинации не с заданным мной сигналом, а с фонограммой.
Не знает, как это реализуется поэтапно?
Нет такой задачи, которую нельзя было бы решить терпением. Так что разобраться придется. Удачи.