Форум программистов, компьютерный форум, киберфорум
Наши страницы
Телефония, офисные АТС
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
1

Программа, моделирующая кодер и декодер АДМ C32

01.03.2019, 20:42. Просмотров 908. Ответов 18
Метки нет (Все метки)

У кого есть программа на C++, Lazarus , Delphi , моделирующая кодер и декодер на основе адаптивной дельта-модуляции , как в системах C32 , модули , визуализирующие спектральные и временные характеристики сигналов в характерных точках функциональной схемы ?

Пример прототипа простого дельта-АЦП (без адаптации шага квантования и фильтра, дарвинский прототип ) был показан в ВРЛ №95 (А. Власкин, С. Годин. Цифровой ревербератор) . Там простые триггер, компаратор и интегратор ( интегратор-УВХ, как в некоторых других схемах с АЦП на Атмегах , благодаря чему можно применить язык программирования с некоторой подпрограммой вместо ОУ -компаратора и интегрирующей цепочки для цифровой эмуляции).
Кликните здесь для просмотра всего текста
Программа, моделирующая кодер и декодер АДМ C32

В книге Тим Кинтцель - Руководство программиста по работе со звуком (2000) есть некоторые сведения , но они не по теме.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2019, 20:42
Ответы с готовыми решениями:

Кодер-декодер.
Я недавно начал писать на бейсике и захотелось написать программу которая бы переводила русский...

кодер/декодер
здравствуйте. есть небольшой проект - консольное приложение кодера/декодера (сишные файлы...

Кодер/декодер
Как на дельфи можно так закодировать и раскодировать?

кодер-декодер
Ребят, такая проблема: надо написать программу кодер(или шифратор, как вам удобнее) программу...

Декодер и Кодер Морзе
Господа форумчане! Необходимо написать кодер и декодер на дельфи. Сигнал принимается с микрофона и...

18
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
14.03.2019, 00:29  [ТС] 2
Сведения про ИЦС-32
Сведения про ИЦС-32:
1 Интегральная цифровая сеть связи .Цифровыа коммутационная система С-32 . Описание и технико-экономические характеристики /ЦНИИС. -ПО ДМЗ. М:Днепропетровск, 1994
2 Воронцов А.С., Соловейчик Б.Л., Николаев Г.П. Абонентская кабельная сеть системы С-32 // Электросвязь. -1996 -№1 -с.30
3 Борисов Б.И. , Шелкин С.М. Программное обеспесчение цифровой коммутационной системы С-32 //Электросвязь, -1996 №1-с.19
4 Борисов Б.И. Управление коммутационными ресурсами в системе С-32 // Электросвязь, 1996-№1-с.26
5 Цифровой телефонный аппарат. Техническое описание -Днепропетровск: КБ "Днепровское", 1996
6 Система С-32.Техническое описание, первые результаты испытаний //Л.Е. Варакин, Г.П. Абугов, В.Б.Беляк и др. //Электросвязь. -1996 №1 с.8
7 Поляк М.У. Интегральная цифровая сеть ИЦС-32, наложенная на городскую телефонную сеть общего пользования //Электросвязь, 1993- №11 с.3
8 Кудрявцев Г.Г. , Варакин Л.Е., Поляк М.У. Новая концепция интегральной цифроваой сети: экономика ,стандартизация // Электросвязь , 1996 №1-1 с.2
9 Максименко В.Н. С-32-система , открытая для всех видов терминальных установок//Электросвязь, 1996 -№1 с.38
10 Варакин Л.Е. Телефонизация, телекомпьютеризация и система С-32// Электросвязь, 1996 №1,6 -с. 15
11 Абугов Г.П, , Беляк В.Б. Аппаратные средства системы С-32// Электросвязь , 1996 №1, 6 с.15
12 Беляк В.Б. , Варакин Л.Е., Угер В.Г. Цифровой телефонный аппарат системы С-32 //Электросвязь, 1996-№1 с.36
13 Мультиплексор абонентский удаленный //Техническое описание и инструкция по эксплуатации -Днепропетровск , КБ Днепровское ,1995
14 Дельта-модуляция .Теория и применение . /Венедиктов М.Д., Женевский Ю.П., МарковВ.В, Эйдус Г.С. -М:Радио и связь, 1976
15 Корнышев Ю.Н, Дузь В.И,Стовбун Г.В. Цифровая система коммутации С-32 .Основы построения, проектирования и эксплуатации .Учебное пособие .Ч.1, 2 -Одесса ;УГАС им. А.С. Попова,1998-100с
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
19.03.2019, 00:28  [ТС] 3
Нужно ли использовать ctrerads , multithreads для программы моделирования кодека АДМ C-32 (на лазарусе, Dev-C++, gcc для линукса , Embarcadero C++ , MS Visual C++ (.NET или нет) ) при моделировании интегратора с применением численных методов ?

Достаточно ли интегрирования методом левых прямоугольников (сигнал на входе может быть двоичным , но переходные процессы существуют , для начала метод Ромберга для формулы интегратора на ОУ с заданной постоянной времени ) ?

Для моделирования отсчетов сигнала на выходах и входах кодека и в линии выбрать шаг квантования по времени для суботсчетов (численно квазианалоговые отсчеты ) в 10 ... 1000 меньше 0,1...0,2 мкс
(#define dtmin_step 0.1e-7 //change it , #define tsamples 31,25e-6 , #define dt_rx_0 2e-6 , #define dt_rx_1 4e-6 , #define dt_tx_1 2e-6 #define dt_tx_0 0 или нет ) #defile delay_rx 2e-6, ... , #define dU_tx_phone -3 ,#define dU_rx_phone 3 ,#define U0line_phone 16, #define Ulog0 0, #define Ulog1 4.75 //4,75...5,1 например) .

В начале пренебречь паразитными выбросами , в дальнейшем ввести подпрограмму моделирования.
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
21.03.2019, 01:26  [ТС] 4
Неполная информация есть в http://microsin.net/programming/avr/avr336-adpcm-decoder.html (другой кодек, другая чатота дискретизации , но похоже ). Действительно ли в С-32 G.700, G.721 ?
0
21.03.2019, 01:26
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
24.03.2019, 19:16  [ТС] 5
Как на AVR сделать модель кодека (выходы и входы битов, без модуляции длительности импульсов для ЦАЛ), аналогичного кодеку адаптивной дельта-модуляции С-32 (с таким же законом адаптации шага квантования , кодер и декодер + интегратор приема, интегратор передачи ), соединяя выход и вход получить модель кодера , работающего на декодер ? Как переделать апноут AVR336 ? Какие параметры элементов интегратора подходят (взять за основу статью Попеля про цифровой телефон системы С-32 )? Можно ли это делать с тактовой частотой МК 8 МГц ? Это уже не совершенно секретная информация . Что надо менять в G.700, G.721 ?

У кого есть журнал Электросвязь 1/1996 -10/1996 ?

Добавлено через 2 минуты
Частоту дискретизации выбрать 32 кГц.

Добавлено через 10 минут
Изобретение считать не предназначенным для фрикинговых , террористических и коммерческих целей (использовать только в учебных и академических целях, для развития возможностей САПРа и языков программирования ).
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
09.04.2019, 23:26  [ТС] 6
Правильна ли следующая программа (изменить подпрограмму адаптации шага квантования и постоянную времени интегратора ) ?
file.zip

Наброски на тему ветвления для кодов управления и выбора режима работы . ISR- функции по таймерам временно не имплементованы . Некоторые коды могут быть неполноценны .
По flag_cdc=1 по прерыванию должен включаться режим кодека .

Вызов в некоторых процедур с кнопок иммитирует вызов некоторых функций по прерыванию . Шифрование матрицы кнопок
условное, заменяет реакции на сигнатуры при опросе клавиатуры . Некоторые модули модифицированы для визуализации процессов в них .
c32.zip

Кодек встраивается в программу в дальнейшем . Настоящая программа пишется на ассемблере, "чипном" С++ соответствующего процессора с соответствующим использованием прерываний от таймеров и кнопок и группировкой подпрограмм приема битов и передачи битов по прерываниям . В SpeakCDC_IO_Sub() может быть программа управления модулями кодека (заменена условными сообщениями ). Особенность использования программы выбора режима и подпрограммы синхронизации зависит от конкретной реализации программы на ассемблере ( С++ ) и типа контроллера.
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
11.04.2019, 02:44  [ТС] 7
Для адаптации шага квантования интегратора приема с АЦП на основе ШИМ встроить в процедуру интегрирования программу численного моделирования ШИМ . Пример модуля
Код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
unit Pwmsubs;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils ;
type
 
    func = function(  x: double ): double;
     func2arg = function(x: double ;  Uinp : double ): double;
  //  func3arg = function(x: double ;   Uinp1_t : double;  DCycle: double ): double;
 
 
 
    function GetPWM_DCYCLE(t : double ; Um1 : double; Um0: double;  T_pwm: double;   DCycle : double ) :double;
 
 
 
implementation
   uses main;
 
   var tmp: integer=0;
 
 
 
 
  function GetPWM_DCYCLE(t : double ; Um1 : double; Um0: double;  T_pwm: double;   DCycle : double ) :double;
 
 
 
  {
     ______            _______           _______         ______
    |      |          |       |         |       |       |      |
____|      |__________|       |_________|       |_______|      |___
     t1     t2         t3      t4        t5      t6    t7     t8
 
   t1=0           //tfront
   t2=t1+tau_pwm  //tedge
   t3=t1+T        t mod T=0
   t4=t1+T+tau_pwm
   t5=t1+2*T      t mod T=0
   t6=t1+2*T+tau_pwm
   t7=t1+3*T;     t mod T=0
   t8=t1+3*T+tau_pwm
 
 
  }
     var  tau_pwm :double;
       Uout_pwm: double ;
       tfront,tedge : double;
 
 
 
 
 begin
     tau_pwm:=T_pwm*DCycle/100;     // в разах
 
      tfront:= (Trunc(t/T_pwm)*T_pwm);
      tedge:=tfront+tau_pwm;
 
     // Form1.Memo1.Lines.Add('   n='+FloatToStr(n)+' tfront= '+FloatToStr(tfront)+' tedge= '+FloatToStr(tedge));
 
     Uout_pwm:= Um0;
     if ((t>=tfront) and (t<tfront+T_pwm)) then  Uout_pwm:=Um1;               //front
     if ((t>=tedge ) and ( t<tfront+T_pwm)) then  Uout_pwm:=Um0;               //edge
 
 
     Result:=Uout_pwm;
 
 end;
 
 
 
                 {
function Uinput_t( x: double ;   Uinp1_t : double;  DCycle: double  ): double ; //подынтегральная функция
var res1: double;
    Tpwm: double;
begin
       Tpwm:=31.25e-6*4;
       res1:=GetPWM_DCYCLE(x,Uinp1_t,-Uinp1_t,Tpwm, DCycle  );
 
 
Result:=res1   ;
end;
 
 
              }
 
 
 
 
 
 
end.

pwm.zip

Модуль тестирования ШИМ- функции с вычислителями среднего значения (используется для выбора коэффициентов заполнения ) и СКЗ (на всякий случай ) .

Код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
unit main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,pwmsubs;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var   i: integer;
      t: double;
      u: double;
      Umax,Umin , DCY : double;
      Tpwm:double;
 
      Uaverage : double ;
      Urms,sumsquared: double ;
      size1: integer;
 
begin
        size1:=100;
        uaverage:=0;
        sumsquared:=0;
 
        Umax:=StrToFloat(Edit1.Text);
        Umin:=StrToFloat(Edit4.Text);
        Tpwm:=StrToFloat(Edit2.Text);
        DCY:=StrToFloat(Edit3.Text);
 
 
        for i:=0 to  size1-1  do
        begin
         t:=1.0*i*Tpwm/size1;
 
        u:=GetPWM_DCYCLE(t , Umax,Umin, Tpwm,   DCY ) ;
        Uaverage:=Uaverage+u;
        sumsquared:=sumsquared+(u*u) ;
 
         Memo1.Lines.Add('i='+IntToStr(i)+'  t=  '+FloatToStr(t)+'  u=   '+FloatToStr(u)  );
 
        end;
 
          Uaverage:=Uaverage/size1;
          Urms:=sqrt(1.0*sumsquared/size1);
          Memo1.Lines.Add('  ');
          Memo1.Lines.Add('items:'+IntToStr(size1));
          Memo1.Lines.Add(' U average=   '+FloatToStr(Uaverage)+' Urms='+FloatToStr(Urms) );
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
              Memo1.Lines.Clear;
end;
 
 
end.


Вариант программы с ШИМ и АИМ в декодере (изменить коэффициенты и постоянную времени, подключить ЦФНЧ, переключить с АИМ на ШИМ ).
file2.zip

Код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
unit IntSubs;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
const
   T_pwm=31.25/4 ;
 
type
 
    func = function(  x: double ): double;
    func2arg = function(x: double ;  Uinp  : double ): double;
    func3arg = function(x: double ;  Uin1 : double; const DCy : double ): double;
 
    function GetIntegral(U0: double  ; R:double; C: double; tmax:   double;   Uin1 :   double  ):double ;
 
    function GetIntegralPWM(U0: double  ; R:double; C: double; tmax: double;   Uin1 :   double; const DCY: double    ):double ;
 
 
 
implementation
 
 
 
 
 
function trap (  a, b, eps: double;     Uinp  : double ; const intfunc: func2arg       ): Double;
var
h1,s,s0,s1,sn,Uin   : double;
i,n: integer;
begin
 
s:=1;
sn:=101;
n:=4;
Uin:=Uinp;
s0:=(intfunc(a,Uin  )+intfunc(b, Uin ))/2;
 
s1:=intfunc ( ((a+b)/2) ,Uin  );
while (Abs(s-sn)>eps) do
begin
sn:=s;
h1:=(b-a)/n;
 
  i:=0 ;
  while  i<(n/2)   do
  begin
 
  s1:=s1+intfunc(( a+(2*i+1)*h1 ),Uin )  ;
  i:=i+1;
  end;
s:=h1*(s0+s1);
n:=n*2;
end ;
Result:= s;
end;
 
 
 function Uinput( x: double ;   Uinp  : double  ): double ; //подынтегральная функция
begin
 
Result:=Uinp  ;
end;
 
 function GetIntegral(U0: double  ; R:double; C: double; tmax: double;   Uin1 :   double   ):double ;
const
eps=1e-8;
 
begin
 
 Result:=U0-(1/(R*C)) *trap (0,tmax, eps,   Uin1,  @Uinput   );;
end;
 
 
 
 
 
 
 {  ****************************************** }
 
function trap2 (  a, b, eps: double;     Uinp_t  : double ;  const DCy  : double ;    const intfunc: func3arg       ): double;
var
h1,s,s0,s1,sn  ,Uin_t  : double;
i,n: integer;
begin
 
s:=1;
sn:=101;
n:=4;
 
   Uin_t:=Uinp_t;
 
s0:=(intfunc(a,Uin_t ,DCy  )+intfunc(b, Uin_t ,DCy))/2;
 
s1:=intfunc ( ((a+b)/2) ,Uin_t ,DCy  );
while (Abs(s-sn)>eps) do
begin
sn:=s;
h1:=(b-a)/n;
 
  i:=0 ;
  while  i<(n/2)   do
  begin
 
  s1:=s1+intfunc( ( a+(2*i+1)*h1 ) ,Uin_t ,DCy )  ;
  i:=i+1;
  end;
s:=h1*(s0+s1);
n:=n*2;
end ;
Result:= s;
end;
 
 
 
 
 
 
 function GetPWM_DCYCLE(t : double ;  const  Um1 : double; const   Um0: double; const   Tpwm : double; const  DCycle : double ) :double;
 
 
 
 {
     ______            _______           _______         ______
    |      |          |       |         |       |       |      |
____|      |__________|       |_________|       |_______|      |___
    t1     t2         t3      t4        t5      t6    t7     t8
 
  t1=0           //tfront
  t2=t1+tau_pwm  //tedge
  t3=t1+T        t mod T=0
  t4=t1+T+tau_pwm
  t5=t1+2*T      t mod T=0
  t6=t1+2*T+tau_pwm
  t7=t1+3*T;     t mod T=0
  t8=t1+3*T+tau_pwm
 
 
 }
    var
      tau_pwm : double;
      Uout_pwm: double ;
      tfront,tedge : double;
 
 
 
 
begin
 
     tau_pwm:=Tpwm*DCycle*0.01 ;     // в разах
 
     tfront:= 1.0*(Trunc(t/T_pwm)*T_pwm);
     tedge:=tfront+tau_pwm;
 
 
 
    Uout_pwm:= Um0;
    if ((t>=tfront) and (t<tfront+T_pwm)) then   Uout_pwm:=Um1;               //front
    if ((t>=tedge ) and ( t<tfront+T_pwm)) then  Uout_pwm:=Um0;               //edge
 
 
    Result:=Uout_pwm;
 
end;
 
 
 
 
 
 function UinputPWM( x: double ;   Uin1 : double ; const DCy : double    ): double ;
   var
    res1: double=0;
     Tpwm: double;
 begin
        Tpwm:=T_pwm;
         res1:=GetPWM_DCYCLE(x,  Uin1, -Uin1, Tpwm, DCy );
 
 
 Result:=res1;
 end;
 
 
 
 
 
 
 
 
function GetIntegralPWM(U0: double  ; R:double; C: double; tmax: double;   Uin1 :   double; const    DCY: double    ):double ;
const
eps=1e-8;
 
begin
 
 
 Result:=U0-(1/(R*C)) *trap2(0,tmax, eps,    Uin1, DCY , @UinputPWM  );
end;
 
 
 
 
end.


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
unit Comparator;
 
{$mode objfpc}{$H+}
 
interface
 
 
 
uses
  Classes, SysUtils;
 
 
const
  ucomphigh =2.5;
  ucomplow =-2.5;
  uopmid=2.5;
  uout=2.5;
 
 
   function Compare ( xplus: double; xminus: double): integer ;
   function SetSample  ( Sample1: integer) : integer ;
   function GetSample  ( ) : integer ;
   function ParseStep(yin0: integer ):double;
 
 
    procedure GetDelta;
 
 
implementation
 uses Unit1, IntSubs;
 
 
 var
 
    sample: integer;
     x :double=uopmid;
      xp  : double =uopmid;
      xr: double =uopmid ;
    y, comp : integer;
 
 
      yint,yint1: double ;
      yin1,yin2,yin3: integer; // delay line
      yrin1,yrin2,yrin3: integer; // delay line
      step: integer =0;
      step1: integer =0;
 
function Compare ( xplus: double; xminus: double) : integer ;
    begin
       if(xplus> xminus) then Result:=1;    //1
       if(xplus=xminus) then Result:=1;   //~=1
       if(xplus<xminus) then Result:=0;  //0
    end;
 
 function SetSample  ( Sample1: integer) : integer ;
    begin
        sample:= Sample1;
        Result:= sample;
    end;
 
 
  function GetSample  ( ) : integer ;
     begin
 
         Result:= sample;
     end;
 
  function ParseStep(yin0: integer ):double;
    var
         koef:double;
         uout2: double ;
  begin
    //ldm
     yin3:=yin2 ;
     yin2:=yin1 ;
     yin1:=yin0 ;
 
        if((yin3=yin2)and(yin2=yin1) and(yin1=yin0)) then
        begin
         if (step<3) then   step:=step+1  else step:=3
 
        end
        else
          if (step >0) then step:=step-1 else step:=0;
 
        case step of
          0: koef:=(15/820);  //fix coeffs ,change tau_int
 
          1: koef:=(15/200);  //fix coeffs ,change tau_int
 
          2: koef:=(15/51);   //fix coeffs ,change tau_int
 
          3: koef:= (15/13);  //fix coeffs ,change tau_int
 
          end;
 
              Form1.Memo2.Lines.Add('step='+IntToStr(step)  );
 
            if (yin0=1) then uout2:= ucomphigh else uout2:= ucomplow;
 
 
 
    Result:=   -koef*uout2;
                 //fix sign of the signal
 
 
 
 
  end;
 
 
 function  ParseRX( yrin0: integer ): double;
  var
         koef:double;
         urout2: double ;
  begin
             if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;
                koef:=1;
 
    Result:=      -koef*urout2;
                 //fix sign of the signal
 
  end;
 
 
 
 
 
 
 function ParseStepRX(yrin0: integer ):double;
   var
        koef1: double;
         //DCYout: double ;
         urout2: double ;
 begin
   //ldm
    yrin3:=yrin2 ;
    yrin2:=yrin1 ;
    yrin1:=yrin0 ;
 
       if((yrin3=yrin2)and(yrin2=yrin1) and(yrin1=yrin0)) then
       begin
        if (step1<3) then   step1:=step1+1  else step1:=3
 
       end
       else
         if (step1 >0) then step1:=step1-1 else step1:=0;
 
       case step1 of
          0:  koef1:=(15/820); //0,02   0.01  fix
             // koef1:=50+0.01*50; //  fix
          1:  koef1:=(15/200); //0.075  0.04     fix
             //koef1:=50+0.04*50; //fix
 
          2:  koef1:=(15/51); //0.294   0.2         fix
             //koef1:=50+0.2*50; //fix
          3:  koef1:= (15/13);//1.153   0.576       fix
              //koef1:=50+0.576*50;
            //fix number of steps
         end;
 
              Form1.Memo3.Lines.Add('step rx='+IntToStr(step)  );
 
             if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;
 
            // DCYout:=koef1;
 
 
    //Result:=    DCYout;
    Result:=      -koef1*urout2;
 
         //fix sign of the signal
 
 
 
 
 end;
 
 
 
 
 
 procedure GetDelta;
    var R1,C1,ts: double;
        DCY:double;
begin
 
    R1:=StrToFloat(Form1.Edit1.Text);
     C1:=StrToFloat(Form1.Edit3.Text);
     ts:=StrToFloat(Form1.Edit4.Text);
    x:=StrToFloat(Form1.Edit2.Text);
 
 
    xp:= GetIntegral(xp,R1,C1,ts ,  yint)  ;
 
 
 
 
    comp:=Compare ( x, xp) ;
    SetSample  (comp)  ;
 
 
 
 
     y:= GetSample ();
 
     yint:=ParseStep(comp);
     Form1.Memo2.Lines.Add('xp='+FloatToStr(xp));
 
          Form1.Memo1.Lines.Add('y='+FloatToStr(y));
          Form1.Memo1.Lines.Add(' '  );
 
     // yint1:=ParseRX(y);
     // DCY:= ParseStepRX(y);
 
        DCY:=100;
        yint1:= ParseStepRX(y);
 
 
       xr:=GetIntegralPWM(xr,   R1, C1, ts,  yint1 ,    DCY   )  ;
       Form1.Memo3.Lines.Add('xr='+FloatToStr(xr));
 
 
 
 
 
end;
 
end.
 
 
 
 
 
 
{
 
 
 
 
    Ниже приведен алгоритм АДМ, используемый в ЦТА.
 
А) Цифровой сигнал на выходе кодера q(i):
 
Q(i) = sign[ x(i) – xq(i) ] , (1)
 
Где x(i) – сигнал на входе ; xq(i) – восстановленный сигнал.
 
Б) Адаптация шага квантования {H(i)} :
 
H(i) = { H(i-1) – [ H(i-1) ] * 2 + dH } , (2)
 
Где {.} – операция округления до восьми разрядов,
к – показатель затухания (к=-8),
dH – приращение шага,
dH=2 в случае, когда знак входного сигнала sign(i) = sign(i-1) = sign(i-2) = sign(i-3), и
dH=0 в остальных случаях.
Величина H(i) представлена 16-разрядным двоичным числом.
 
В) Восстановленный сигнал
 
Xq(i) = [{H(i)}*q(i)*P(z), (3)
 
Где P(z) – передаточная функция восстанавливающего фильтра
 
P(z) = [1+b1 *z-1 +b2 *z-2 ]/[1+a1 *z-1 +a2 *z-2 ] (4)
 
Где
 
В кодере:
 
В декодере:
 
A1 = -1,544282,
 
A1 = -1,611942,
 
A2 = 0,567961,
 
A2 = 0,631574,
 
B1 = 0,603896,
 
B1 = 0,603896,
 
B2 = -0,396104
 
B2 = -0,396104.
 
Применение цифровой абонентской линии позволяет использовать
двоичный код с высокой скоростью передачи символов протокола
обмена сигнальной информацией со станцией.
Поэтому как информационные сигналы, так и сигналы
взаимодействия со станцией передаются по абонентской линии в цифровой форме.
Для защиты информационного сигнала от несанкционированного прослушивания
перед поступлением в линию он подвергается скремблированию.
 
 
 
 
 
 
 
 
 
 
 
}
Pascal
1
ParseStepRX(yrin0: integer ):double;

как правильно выбрать коэффициенты ШИМ (в режиме
koef1:=50+0.01*50; //set DutyCycle , fix Tpwm ,tau integr.

...
)?
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
11.04.2019, 23:38  [ТС] 8
Преобразование , аналогичное использованному в телефонах ОКАПИ-202Р(но междусемпловая ШИМ для ИПр на выходе здесь временно заменена на АИМ , коэффициенты адаптации шага перед входом ИПд и постоянные времени интеграторов не оптимизированы, уровни условные , относительно смещенной переменной составляющей на входе ).
Знаки расставлены под инвертирующий усилитель ОУ на входе чипа и инвертирующий усилитель на выходе.
Код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
unit Comparator;
 
{$mode objfpc}{$H+}
 
interface
 
 
 
uses
  Classes, SysUtils;
 
 
const
  ucomphigh =2.5;     //Ulog1 mcu  for op. amp. with unipolar Vcc with bias V/2, may be 5 V, instabile 
  ucomplow =-2.5;     //Ulog0 mcu  for op. amp. with unipolar Vcc with bias V/2, may be 0 V, instabile 
  uopmid=0;     //(Vopamp+  +  Vopamp-)/2, for this program , may be 2.5 V
  uout=0;         //(Vopamp+  +  Vopamp-)/2,  may be 2.5 V
 
 
   function Compare ( xplus: double; xminus: double): integer ;
   function SetSample  ( Sample1: integer) : integer ;
   function GetSample  ( ) : integer ;
   function ParseStep(yin0: integer ):double;
 
 
    procedure GetDelta;
 
 
implementation
 uses Unit1, IntSubs;
 
 
 var
 
    sample: integer;
     x :double=uopmid;
      xp  : double =uopmid;
      xr: double =uopmid ;
    y, comp : integer;
 
 
      yint,yint1: double ;
      yin1,yin2,yin3: integer; // delay line
      yrin1,yrin2,yrin3: integer; // delay line
      step: integer =0;
      step1: integer =0;
 
function Compare ( xplus: double; xminus: double) : integer ;
    begin
       if(xplus> xminus) then Result:=1;    //1
       if(xplus=xminus) then Result:=1;   //~=1
       if(xplus<xminus) then Result:=0;  //0
    end;
 
 function SetSample  ( Sample1: integer) : integer ;
    begin
        sample:= Sample1;
        Result:= sample;
    end;
 
 
  function GetSample  ( ) : integer ;
     begin
 
         Result:= sample;
     end;
 
  function ParseStep(yin0: integer ):double;
    var
         koef:double;
         uout2: double ;
  begin
    //ldm
     yin3:=yin2 ;
     yin2:=yin1 ;
     yin1:=yin0 ;
 
        if((yin3=yin2)and(yin2=yin1) and(yin1=yin0)) then
        begin
         if (step<3) then   step:=step+1  else step:=3
 
        end
        else
          if (step >0) then step:=step-1 else step:=0;
 
        case step of
          0: koef:=(15/820);
 
          1: koef:=(15/200);
 
          2: koef:=(15/51);
 
          3: koef:= (15/13);
 
          end;
 
              Form1.Memo2.Lines.Add('step='+IntToStr(step)  );
 
            if (yin0=1) then uout2:= ucomphigh else uout2:= ucomplow;
 
 
 
    Result:=    koef*uout2;
                 //fix sign of the signal
 
 
 
 
  end;
 
 
 function  ParseRX( yrin0: integer ): double;
  var
         koef:double;
         urout2: double ;
  begin
             if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;
                koef:=1;
 
    Result:=       koef*urout2;
                 //fix sign of the signal
 
  end;
 
 
 
 
 
 
 function ParseStepRX(yrin0: integer ):double;
   var
        koef1: double;
         //DCYout: double ;
         urout2: double ;
 begin
   //ldm
    yrin3:=yrin2 ;
    yrin2:=yrin1 ;
    yrin1:=yrin0 ;
 
       if((yrin3=yrin2)and(yrin2=yrin1) and(yrin1=yrin0)) then
       begin
        if (step1<3) then   step1:=step1+1  else step1:=3
 
       end
       else
         if (step1 >0) then step1:=step1-1 else step1:=0;
 
       case step1 of
          0:  koef1:=(15/820); //0,02   0.01  fix
             // koef1:=50+0.01*50; //  fix
          1:  koef1:=(15/200); //0.075  0.04     fix
             //koef1:=50+0.04*50; //fix
 
          2:  koef1:=(15/51); //0.294   0.2         fix
             //koef1:=50+0.2*50; //fix
          3:  koef1:= (15/13);//1.153   0.576       fix
              //koef1:=50+0.576*50;
            //fix number of steps
         end;
 
              Form1.Memo3.Lines.Add('step rx='+IntToStr(step)  );
 
             if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;
 
            // DCYout:=koef1;
 
 
    //Result:=    DCYout;
    Result:=       koef1*urout2;
 
         //fix sign of the signal
 
 
 
 
 end;
 
 
 
 
 
 procedure GetDelta;
    var R1,C1,ts: double;
        DCY:double;
begin
 
    R1:=StrToFloat(Form1.Edit1.Text);
     C1:=StrToFloat(Form1.Edit3.Text);
     ts:=StrToFloat(Form1.Edit4.Text);
    x:=StrToFloat(Form1.Edit2.Text);
 
 
    xp:= GetIntegral(xp,R1,C1,ts ,  yint)  ;
 
 
 
 
    comp:=Compare (   xp , -x  ) ;
    SetSample  (comp)  ;
 
 
 
 
     y:= GetSample ();
 
     yint:=ParseStep(comp);
     Form1.Memo2.Lines.Add('xp='+FloatToStr(xp));
 
          Form1.Memo1.Lines.Add('y='+FloatToStr(y));
          Form1.Memo1.Lines.Add(' '  );
 
     // yint1:=ParseRX(y);
     // DCY:= ParseStepRX(y);
 
        DCY:=100;
        yint1:= ParseStepRX(y);
 
 
       xr:=GetIntegralPWM(xr,   R1, C1, ts,  yint1 ,    DCY   )  ;
       Form1.Memo3.Lines.Add('-xr='+FloatToStr(-xr));
 
 
 
 
 
end;
 
end.


Вариант программы с ползунком и таймером (с багами в подпрограммах адаптации шага квантования, числа шага условные ).
ADPCM.zip

Из Пейтона А. (1994), с 182-185

Код
Rfeedb=15kOm; (нельзя принебречь )    или 200 кОм для ШИМ  (можно принебречь)
R1=82kOm; 200kOm;51kOm;13kOm;
C1=4.7...10nF
fs=32kHz>>fn=16kHz
Uout/Uin= -(1/C1R1)/(s+(1/(C1*R1*Ku))  +(1/Rfeedb*C1));
fn=(1/(2*pi*Ku*R1*C1) )+(1/(2*pi));
fv=fa;
Перейти от частотных отображений по Лапласу (s=jw, frequency domain ) к оригиналу (time domain) передаточной функции интегратора (или вывести заново передаточную функцию используя следствие для напряжения из выражения для тока ic = C *dUc/dt , законы Кирхгофа, формулу для инвертирующего усилителя ).
Кликните здесь для просмотра всего текста
Программа, моделирующая кодер и декодер АДМ C32
Программа, моделирующая кодер и декодер АДМ C32
Программа, моделирующая кодер и декодер АДМ C32
Программа, моделирующая кодер и декодер АДМ C32


Из Титце У., Шенк К. Полупроводниковая схемотехника. 12-е издание. Том II: Перевод с немецкого. - М.: ДМК Пресс, 2007. - 942 с.: ил сведения про инвертирующий ФНЧ . Вывести выражение передаточной функции для полосы заграждения .
2.zip

Код
Rfeedb=15kOm; (нельзя пренебречь )    или 200 кОм для ШИМ  (можно пренебречь)
R1=820kOm; 200kOm;51kOm;13kOm;
Вариант программы с АИМ,ШИМ и переключаемыми резисторами (исправить коэффициенты и формулу результирующего резистора интегратора).
AIM_PWM_ADM.zip

Переделанная предыдущая программа с регулировкой Uav с помощью коэффициентов ШИМ ( CCPR1L,CCPR1H -это DutyCucle в масштабе, а период Tpwm регулируется PR2 в масштабе , http://narodstream.ru/pic-urok-14-modul-ccp-rezhim-pwm/ ) , изменяя DutyCucle
(в предыдущей- с помощью ШИМ и управляемого инвертора на not(data(t) xor pwm_signal(t) ) , аналоговое лог. 0 =-U/2, лог. 1=U/2 ) .

Как устранить "расходимость " в интеграторе приема, по какой формуле должны быть вычислены коэффициенты , по какой формуле на самом деле надо вычислять коэффициенты DutyCucle 0 , 1, 2 , 3 для лог. 0 и лог 1.на выходе компаратора (чтобы избежать "чернобыльской" расходимости и дрейфа ur[n] на выходе ИПр) ? С АИМ нормально , но коэффициенты не по формуле .

Какая кратность частоты импульсов ШИМ-заполнения частоте прерываний fs=32 кГц (отсчеты) ? Fpwm=1...4...8 *fs ?
В какой фазе лучше начинать импульсы ?

Можно ли вычислять DCYout для нулевых сигналов компаратора по формуле (вызывает ошибку на выходе ИПр, но среднее значение похоже на требуемое на входе предиктора (интегратор передачи ИПд) , может , мы неправильно интегрируем или тонкая структура биений и шума тактовых непрвильно определена ) :

Кликните здесь для просмотра всего текста
Pascal
1
if (yrin0=0) then DCYout:=100-DCYout ;

Вариант модуля компаратора (с нарастающей ошибкой расходимости на выходе ):
Pascal
1
 
unit Comparator;

{$mode objfpc}{$H+}

interface



uses
Classes, SysUtils;


const
ucomphigh =2.5; //Ulog1 mcu for op amp with unipolar Vcc with bias V/2
ucomplow =-2.5; //Ulog0 mcu for op amp with unipolar Vcc with bias V/2
uopmid=0;
uout=0;


function Compare ( xplus: double; xminus: double): integer ;
function SetSample ( Sample1: integer) : integer ;
function GetSample ( ) : integer ;
function ParseStep(yin0: integer ):double;


procedure GetDelta;


implementation
uses Unit1, IntSubs;


var

sample: integer;
x :double=uopmid;
xp : double =uopmid;
xr: double =uopmid ;
y, comp : integer;
VR : double =820; //fix



yint,yint1: double ;
yin1,yin2,yin3: integer; // delay line
yrin1,yrin2,yrin3: integer; // delay line
step: integer =0;
step1: integer =0;

function Compare ( xplus: double; xminus: double) : integer ;
begin
if(xplus> xminus) then Result:=1; //1
if(xplus=xminus) then Result:=1; //~=1
if(xplus<xminus) then Result:=0; //0
end;

function SetSample ( Sample1: integer) : integer ;
begin
sample:= Sample1;
Result:= sample;
end;


function GetSample ( ) : integer ;
begin

Result:= sample;
end;


function ParseUTX( yrin0: integer ): double;
var

urout2: double ;
begin
if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;


Result:= urout2;


end;






function ParseStep_VR(yin0: integer ):double;
var
koef_r:double;

begin

yin3:=yin2 ;
yin2:=yin1 ;
yin1:=yin0 ;

if((yin3=yin2)and(yin2=yin1) and(yin1=yin0)) then
begin
if (step<3) then step:=step+1 else step:=3

end
else
if (step >0) then step:=step-1 else step:=0;

case step of
0:
koef_r:=StrToFloat(Form1.StringGrid1.Cells[1,1]);
1:
koef_r:=StrToFloat(Form1.StringGrid1.Cells[1,2]);
2:
koef_r:=StrToFloat(Form1.StringGrid1.Cells[1,3]);
3:
koef_r:=StrToFloat(Form1.StringGrid1.Cells[1,4]);
end;



Result:= koef_r ;

Form1.Memo2.Lines.Add('step='+IntToStr(step)+' R='+FloatToStr(koef_r) );


end;




function ParseStep(yin0: integer ):double; //fix coefs
var
koef:double;
uout2: double ;
begin

yin3:=yin2 ;
yin2:=yin1 ;
yin1:=yin0 ;

if((yin3=yin2)and(yin2=yin1) and(yin1=yin0)) then
begin
if (step<3) then step:=step+1 else step:=3

end
else
if (step >0) then step:=step-1 else step:=0;

case step of
0: //koef:=(15/820);
koef:=StrToFloat(Form1.StringGrid1.Cells[2,1]);
1: //koef:=(15/200);
koef:=StrToFloat(Form1.StringGrid1.Cells[2,2]);
2: //koef:=(15/51);
koef:=StrToFloat(Form1.StringGrid1.Cells[2,3]);
3: //koef:= (15/13);
koef:=StrToFloat(Form1.StringGrid1.Cells[2,4]);
end;



if (yin0=1) then uout2:= ucomphigh else uout2:= ucomplow;



Result:= koef*uout2;

Form1.Memo2.Lines.Add('step='+IntToStr(step)+' koef='+FloatToStr(koef)+' U='+FloatToStr(Result) );






end;




{ ********************************* }




function ParseURX( yrin0: integer ): double;
var

urout2: double ;
begin
if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;


Result:= urout2;


end;



function ParseStepRX_PWM(yrin0: integer ):double;
//change coeffs in the table
//fix problem of the noise compensation
//parser of Uav in the coefficients DCy[i] ( in the table )
var

DCYout: double ;
ur2,uav: double ;
begin

yrin3:=yrin2 ;
yrin2:=yrin1 ;
yrin1:=yrin0 ;

if((yrin3=yrin2)and(yrin2=yrin1) and(yrin1=yrin0)) then
begin
if (step1<3) then step1:=step1+1 else step1:=3

end
else
if (step1 >0) then step1:=step1-1 else step1:=0;

case step1 of
0:
//50 % is Uav=0 (in the analog format, for op.amp. , GND' is V/2 ,Ugnd'=0')
//100% is Uav=yrin0 (in the analog format, for op.amp. , GND' is V/2)
//0% is Uav=-yrin0 (in the analog format, for op.amp. , GND' is V/2)

if(yrin0=1) then begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[4,1]);
end else begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[5,1]);

end;


1:

if(yrin0=1) then begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[4,2]);
end else begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[5,2]);

end;
2:

if(yrin0=1) then begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[4,3]);
end else begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[5,3]);

end;
3:

if(yrin0=1) then begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[4,4]);
end else begin
DCYout:=StrToFloat(Form1.StringGrid1.Cells[5,4]);

end;

end;


// if (yrin0=1) then ur2:= ucomphigh else ur2:= ucomplow;

//if (yrin0=0) then DCYout:=100-DCYout ;

ur2:= ucomphigh ;

uav:=ur2*(0.02*( DCYout-50));

Result:= DCYout;
Form1.Memo3.Lines.Add('step rx ='+IntToStr(step1)+' DutyCycle='+FloatToStr(DCYout)+' Uav=' +FloatToStr(uav) );





end;




function ParseStepRX(yrin0: integer ):double;
var
koef1: double;

urout2: double ;
begin

yrin3:=yrin2 ;
yrin2:=yrin1 ;
yrin1:=yrin0 ;

if((yrin3=yrin2)and(yrin2=yrin1) and(yrin1=yrin0)) then
begin
if (step1<3) then step1:=step1+1 else step1:=3

end
else
if (step1 >0) then step1:=step1-1 else step1:=0;

case step1 of
0: //koef1:=(15/820); //0,02 0.01 fix

koef1:= StrToFloat(Form1.StringGrid1.Cells[3,1]);

1: // koef1:=(15/200); //0.075 0.04 fix

koef1:=StrToFloat(Form1.StringGrid1.Cells[3,2]);
2: // koef1:=(15/51); //0.294 0.2 fix

koef1:=StrToFloat(Form1.StringGrid1.Cells[3,3]);
3: // koef1:= (15/13);//1.153 0.576 fix

koef1:=StrToFloat(Form1.StringGrid1.Cells[3,4]);
//fix number of steps
end;


if (yrin0=1) then urout2:= ucomphigh else urout2:= ucomplow;



Result:= koef1*urout2;
Form1.Memo3.Lines.Add('step rx ='+IntToStr(step1)+' koef='+FloatToStr(koef1)+' U='+FloatToStr(Result) );


end;





procedure GetDelta;
var R1,C1,R2,C2, VR_1, ts: double;
DCY:double;
begin
//fix problem with parsing value of the feedback resistor
R1:=StrToFloat(Form1.Edit1.Text);
C1:=StrToFloat(Form1.Edit3.Text);

R2:=StrToFloat(Form1.Edit5.Text);
C2:=StrToFloat(Form1.Edit6.Text);


ts:=StrToFloat(Form1.Edit4.Text);
x:=StrToFloat(Form1.Edit2.Text);



if(Form1.Checkbox2.Checked=False) then
begin
//fix R1 equivalent formula
xp:= GetIntegral(xp,R1,C1,ts , yint) ;
end
else
begin
VR_1:=VR;//get_r_ekv( VR ,R1); //fix
xp:= GetIntegral(xp,VR_1,C1,ts , yint) ;

end;



comp:=Compare ( xp , -x ) ;
SetSample (comp) ;


y:= GetSample ();

//fix bugs
if(Form1.Checkbox2.Checked=False) then
begin
yint:=ParseStep(y);

end
else
begin
yint:=ParseUTX(y);
VR :=ParseStep_VR(y ) ;
end;


Form1.Memo2.Lines.Add('xp='+FloatToStr(xp));

Form1.Memo1.Lines.Add('y='+FloatToStr(y));
Form1.Memo1.Lines.Add(' ' );

if ( Form1.CheckBox1.Checked=True ) then
begin

// yint1:=ParseURX(y);
yint1:=ucomphigh ;
DCY:= ParseStepRX_PWM(y); //fix coeffs formula
//fix bugs with R2 parser

xr:=GetIntegralPWM(xr, R2, C2, ts, yint1 , DCY ) ;

end
else
begin


yint1:= ParseStepRX(y);
// DCY:=100;

//fix bugs with R2 parse
//R_2:=get_r_ekv( R2 ,Rfeedb);
// xr:=GetIntegralPWM(xr, R_2, C2, ts, yint1 , DCY ) ;
xr:= GetIntegral(xr,R2,C2,ts , yint1) ;

end;


Form1.Memo3.Lines.Add('-xr='+FloatToStr(-xr) );





end;

end.
0
Вложения
Тип файла: zip ADM_PWM_Unipolar.zip (10.63 Мб, 0 просмотров)
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
12.04.2019, 22:22  [ТС] 9
Подразумевается, что DutyCycle=tau1_pwm*100/Tpwm , при логической единице в интервал от 50 до 100% вписывается перестройка среднего значения от 0 (Vcc/2) до Vcomp+, а уменьшение DutyCycle от 50% до 0% вызывает уменьшение напряжения от 0 (Vcc/2) до Vcomp-. Должен ли вывод висеть в воздухе (i_in=0) в неактивной части ШИМ -импульсов (лог 0 ШИМ-функции ) , а не подаваться противоположный уровень (в аналоговых терминах ) уровень, а в активной части ШИМ- импульса уровень должен соответствовать уровню с выхода компаратора (в аналоговых терминах )?

Добавлено через 30 минут
Нужно ли использовать интегрирование методом Монте-Карло (с последовательным слева направо "опросом" площадок dS и их суммированием ), методом прямоугольников (правых или левых, у нас прямоугольный сигнал , так без опроса предыдущих и последующих семплов, но так неточно , но так менше влияет на последовательностное устройство , например, если использовать IIR-модель передаточной функции звена в цифровых терминах и аналоговых на выходе ; если выбросами на ПХ пренебречь ) в подпрограмме интегрирования уровня компаратора (в биполярных терминах для ОУ-компаратора внутри МК) , умноженного на АИМ-коэффициент от семла до семпла и ШИМ-сигнала заполнения , зависимого на интервале от семпла до семпла (раз в 31.25 мкс) от уровня компаратора считанного из ячейки памяти, выраженного в терминах уровней напряжения для ОУ )?

Добавлено через 15 минут
Значения 0,02 ; 0,075; 0,294; 1,153 или 0,02/2 ; 0,075/2; 0,294/2; 1,153/2, а также 51%,54%,65%,100%; 100%-51%, 100%-54%,100%-65%,100%-100% условные , могут не соответствовать изменению шага квантования для АДМ в системе С-32, зависят от параметров интеграторов, использовались только для проверки функционирования программы и стыковки основных функциональных программных модулей программы .
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
18.04.2019, 09:24  [ТС] 10
http://gea.nmu.org.ua/docs/2014/2/93_072-076.pdf уточнение про изменение шага квантования . Коэффициенты и их количество вычислить на основании формулы.

Добавлено через 3 минуты
Уточнить шаг квантования и количестово ступеней с учетом КНД 45-203-2002 и http://gea.nmu.org.ua/docs/2014/2/93_072-076.pdf

Добавлено через 15 секунд
https://zakon.rada.gov.ua/rada/show/en/v1125650-07
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
18.04.2019, 23:14  [ТС] 11
Программа моделирования адаптивной дельта-модуляции на Си++ на основе формул из http://gea.nmu.org.ua/docs/2014/2/93_072-076.pdf . Уточнить
C++
1
 #define Hmax 0x0800
, подпрограммы скремблирования, коэффициенты БИХ- фильтра (особенно b0 , а то расходится ), коэффициенты передачи интегратора , число ступеней квантования .
Правильны ли ограничители :
C++
1
2
3
4
5
  if(H<Hmax ) {
  if(H>0){  H =H-GetX16bit(0, Gethigh(H) )  +  GetX16bit( Gethigh( dH ), 0 );   }   
  else   {  H =H-0+GetX16bit( Gethigh( dH ), 0 );    }  
    
  } else  { H =H -GetX16bit(0, Gethigh(H) )    ;  }
С одним классом глючит (совпадают внутриклассовые временные переменные, а создавал два отдельных экземпляра класса , пришлось добавить метод и развести экземпляры (странно, может, что-то не так с объявлением класса, поинтерами или стеком) ) .
main.zip

C++
1
 H = 0x01  ;     HRX = 0x01  ;
могут быть и другие(выбрать), но одинаковые , при равных нулю не работает .

Добавлено через 2 минуты
Чувствительность условная

Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
Код
j=0


  i=0   x=0.000000e+000, xq=0.000000e+000 , cmp=-1  qn=0  dH=2  H=2  TXBYte= 00000000 qn=0  dH=2  H=2  RXBYte= 00000000 Xqn=-8.865248e-001
  i=1   x=0.000000e+000, xq=-8.865248e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 00000001 qn=1  dH=0  H=1  RXBYte= 00000001 Xqn=-4.432624e-001
  i=2   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 00000011 qn=1  dH=0  H=1  RXBYte= 00000011 Xqn=-0.000000e+000
  i=3   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 00000110 qn=0  dH=0  H=1  RXBYte= 00000110 Xqn=-4.432624e-001
  i=4   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 00001101 qn=1  dH=0  H=1  RXBYte= 00001101 Xqn=-0.000000e+000
  i=5   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 00011010 qn=0  dH=0  H=1  RXBYte= 00011010 Xqn=-4.432624e-001
  i=6   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 00110101 qn=1  dH=0  H=1  RXBYte= 00110101 Xqn=-0.000000e+000
  i=7   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 01101010 qn=0  dH=0  H=1  RXBYte= 01101010 Xqn=-4.432624e-001
  i=8   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 11010101 qn=1  dH=0  H=1  RXBYte= 11010101 Xqn=-0.000000e+000
  i=9   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 10101010 qn=0  dH=0  H=1  RXBYte= 10101010 Xqn=-4.432624e-001
  i=10   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 01010101 qn=1  dH=0  H=1  RXBYte= 01010101 Xqn=-0.000000e+000
  i=11   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 10101010 qn=0  dH=0  H=1  RXBYte= 10101010 Xqn=-4.432624e-001
  i=12   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 01010101 qn=1  dH=0  H=1  RXBYte= 01010101 Xqn=-0.000000e+000
  i=13   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 10101010 qn=0  dH=0  H=1  RXBYte= 10101010 Xqn=-4.432624e-001
  i=14   x=0.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 01010101 qn=1  dH=0  H=1  RXBYte= 01010101 Xqn=-0.000000e+000
  i=15   x=0.000000e+000, xq=-0.000000e+000 , cmp=-1  qn=0  dH=0  H=1  TXBYte= 10101010 qn=0  dH=0  H=1  RXBYte= 10101010 Xqn=-4.432624e-001
...

j=6


  i=0   x=1.000000e+000, xq=-4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 01010101 qn=1  dH=0  H=1  RXBYte= 01010101 Xqn=-0.000000e+000
  i=1   x=1.000000e+000, xq=-0.000000e+000 , cmp=1  qn=1  dH=0  H=1  TXBYte= 10101011 qn=1  dH=0  H=1  RXBYte= 10101011 Xqn=4.432624e-001
  i=2   x=1.000000e+000, xq=4.432624e-001 , cmp=1  qn=1  dH=0  H=1  TXBYte= 01010111 qn=1  dH=0  H=1  RXBYte= 01010111 Xqn=8.865248e-001
  i=3   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=2  H=3  TXBYte= 10101111 qn=1  dH=2  H=3  RXBYte= 10101111 Xqn=2.216312e+000
  i=4   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 01011110 qn=0  dH=0  H=3  RXBYte= 01011110 Xqn=8.865248e-001
  i=5   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 10111101 qn=1  dH=0  H=3  RXBYte= 10111101 Xqn=2.216312e+000
  i=6   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 01111010 qn=0  dH=0  H=3  RXBYte= 01111010 Xqn=8.865248e-001
  i=7   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 11110101 qn=1  dH=0  H=3  RXBYte= 11110101 Xqn=2.216312e+000
  i=8   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 11101010 qn=0  dH=0  H=3  RXBYte= 11101010 Xqn=8.865248e-001
  i=9   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 11010101 qn=1  dH=0  H=3  RXBYte= 11010101 Xqn=2.216312e+000
  i=10   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 10101010 qn=0  dH=0  H=3  RXBYte= 10101010 Xqn=8.865248e-001
  i=11   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 01010101 qn=1  dH=0  H=3  RXBYte= 01010101 Xqn=2.216312e+000
  i=12   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 10101010 qn=0  dH=0  H=3  RXBYte= 10101010 Xqn=8.865248e-001
  i=13   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 01010101 qn=1  dH=0  H=3  RXBYte= 01010101 Xqn=2.216312e+000
  i=14   x=1.000000e+000, xq=2.216312e+000 , cmp=-1  qn=0  dH=0  H=3  TXBYte= 10101010 qn=0  dH=0  H=3  RXBYte= 10101010 Xqn=8.865248e-001
  i=15   x=1.000000e+000, xq=8.865248e-001 , cmp=1  qn=1  dH=0  H=3  TXBYte= 01010101 qn=1  dH=0  H=3  RXBYte= 01010101 Xqn=2.216312e+000

Флаги режимов интеграции переключаются на
C++
1
2
 //#define IIR_mode
   #define Integr
в adpcm_tx.h
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
20.04.2019, 17:10  [ТС] 12
IIR Filter

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdio.h>
#include <iostream>
#include <stdint.h>
#include <math.h>
 
 
/*
 
a1 = 1.544282; 
a2 = -0.567961; 
b1 = 0.603896; 
b2 = -0.396104.
 
d(n) = x(n) – d(n-1) *a1 – d(n-2) * a2;
y(n) = d(n)* b0 + d(n-1)* b1 + d(n-2)*b2;
 
*/
 
 
#define Ord 3
    
    
  
  class IIR_Filter
  {
    double ha[Ord+1]; 
    double hb[Ord+1];
    double Reg[Ord+1];
    
    public:
        void  IIR_Filter_init(  );
        double  IIR_parse(double sample_data     );
    
    
  };
  
  
  
  
  
  
  
void IIR_Filter::IIR_Filter_init(  )
{
     /*
 a1 = 1.544282; 
a2 = -0.567961; 
b1 = 0.603896; 
b2 = -0.396104.      
     
     
     
ha[0] =1;
ha[1] =  - 1.544282; 
ha[2] =  +0.567961; 
 
hb[0] =1;
hb[1] = 0.603896; 
hb[2] = -0.396104;
 */
 
 
   /*
ha[0] =1;
ha[1] = 0; 
ha[2] = 0; 
 
hb[0] =  0.280050;
hb[1] =  0.439901; 
hb[2] =  0.280050 ;
 
*/
 
 
ha[0] =1;
ha[1] = -2.372581; 
ha[2] = 1.927172;
ha[3] =  -0.531251; 
 
hb[0] =  0.002918;
hb[1] =  0.008753; 
hb[2] =  0.008753 ;
hb[3] =  0.002918 ;
 
 
   
 
  /*
ha[0] =1;
ha[1] =0* 0.562524; 
ha[2] = 0*0.417318; 
ha[3] = 0*0.054673;
 
 
hb[0] =    0.254314;
hb[1] =    0.762943; 
hb[2] =    0.762943;
hb[3] =    0.254314;
 */
// Init the delay registers 
 
   for(int j=0; j<Ord; j++) { Reg[j] = 0.0;} 
 
}
 
 
//double   IIR_parse(double sample_data     )
 double  IIR_Filter::IIR_parse(double sample_data     )
{ 
 
 double y ; 
 // Shift the register values.
 for (int i=Ord; i> 0; i-- ) { Reg[i]=Reg[i-1]; } 
// The denominator 
 Reg[0] = sample_data ; 
   for (int i=1; i<=Ord; i++){  Reg[0] -= Reg[i]*ha[i]  ; }
 // The numerator 
 y  =   0;
  for (int i=0; i<=Ord; i++){  y  += Reg[i]*hb[i]  ; }
  
  return    y  ;
}
0
Вложения
Тип файла: zip iirfilter.zip (453.5 Кб, 1 просмотров)
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
28.04.2019, 06:04  [ТС] 13
Различные формы представления коэффициентов и расстановки знаков на схемах , встречающиеся в Интернете и различной литературе применительно к форме записи H(z) c


Код
          b0+b1*z^-1+...+bm*z^-M
H(z)=---------------------------------
          1-   a1*z^-1-...-an*z^-N
в схеме  an с плюсом в Direct-Form II ,  Transposed Direct-Form II 
 

и  y[n]=sum(l=1 to N ; a[l]*y[n-l])+sum(k=0 to N ; b[k]*x[n-k])



Код
y[k]= sum(m=0 to M ; b[m]*x[k-m]) - sum(m=1 to N ; a[m]*y[k-m]) ,k=0,1,2,...

c знаками минус на схеме при a1, a2,...am и 1  на схеме
а также форма представления

Код
          b0+b1*z^-1+...+bm*z^-M
H(z)=---------------------------------
          1+   a1*z^-1+...+an*z^-N
0
Вложения
Тип файла: zip ece2610_chap8 (1).zip (424.4 Кб, 0 просмотров)
Тип файла: zip Расчет фильтра Баттерворта.zip (631.9 Кб, 0 просмотров)
Тип файла: zip Сергиенко А.Б. Цифровая обработка сигналов (2002).zip (9.21 Мб, 0 просмотров)
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
28.04.2019, 06:14  [ТС] 14
Некоторые утилиты( например, QFilter) могут представлять данные в следующем формате
(на примере БИХ-фильтра с Order 2 , FPass=200 Hz , FStop 400 Hz, Ap =3 dB, As=15 dB, Butterworth, Lowpass, FSample =1000Hz ):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*-------------------------------------------------------------
                   File Infomation
     CompanyName:InstruStar Electronic Technology
                 Software:QFilter
--------------------------------------------------------------*/
/*--------------------------------Information-----------------------------------
                        b(0)+b(1)z^(-1)+ ... + b(n)z^(-n)
                 H(z)=------------------------------------------
                        a(0)+a(1)z^(-1)+ ... + a(n)z^(-n)
*/
/*
Lowpass
Sample 1000
Pass 200
Stop 400
Ap 3
As 15
Butterworth
Order 2
Multiplied Coefficient:1
*/
 
int b[3]={
              0.375212, 0.750424, 0.375212
              };
int a[3]={
              1.000000, 0.312014, 0.188835
              };
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
01.05.2019, 18:57  [ТС] 15
Как доработать программу на сайлабе для визуализации работы кодера , добавить скремблирование , чтобы правильно адаптировался шаг :

Код


x=[0 0.1 0.2 -1 1 1 1 0 0 0  0  0  0  0  0  0  0 1  1  0 ];
xq = 0;
q=zeros(1:20);
Uout=0;
Uinp=0;
R=7.5e3;
C=4.7e-9;
 Hprev=256;
t=0;

function y=GetHigh ( H   )
y= bitand(H,hex2dec('FF00') )/256
endfunction

function y=GetLow (H)
y=bitand (H,hex2dec('00FF'))   
endfunction

function dh=Get_dH ( q  , n )
 
if (n>=4) 
then 

     if   (q (n)==q(n-1))&& (q(n-1)==q(n-2))&&(q(n-2)==q(n-3))   then dh=2  else dh=0 end    

else  dh=0 
 
end 

 

endfunction



function st =Get_Step (q, n )


if (Hprev <=256)  then Hprev=256 end
//if(Hprev<hex2dec('0300') ) 
if(Hprev<hex2dec('FF00') )     
 then  
                             Hprev =Hprev-GetHigh (Hprev )+Get_dH (q, n )*256
                              else Hprev=Hprev-GetHigh (Hprev )  
                         end 
                        

st =GetHigh ( Hprev ) 
endfunction

function y=Uin_int(t, Uin)
y=Uin
endfunction
 

function y=sign1(x1)
if (x1>0) y= 1 else y=-1 end

endfunction


function q=Compare(x1,x2 )
q = sign1( (x1 - x2)   )    ;
endfunction 
 
hb=[ 1  0.603896 -0.396104 ];
ha=[  1 -1.544282  -0.567961   ];



for n = 1:20
xsig=x(n);
q(n) =Compare(xsig,xq );
 //q(n) =Compare(xq,-xsig  );
st1=Get_Step (q, n ) ;
Uinp =q(n)*st1;
st2(n)=st1;

  Uout=Uout+ (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 //Uout=Uout- (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 //Uout=filter(hb,ha, Uinp );  
xq= Uout;
end

subplot(4,1,1) 
plot2d2( q ); xtitle ('y')
subplot(4,1,2) 
plot2d2( x ) ; xtitle ('x')
subplot(4,1,3)
plot2d2 ( st2 )  ; xtitle ('st2')
Добавлено через 4 минуты
Код
ha=[ 1  -1.544282  0.567961];
hb=[ 1 0.603896 -0.396104];

[xm,fr]=frmag(hb,ha,512);
subplot(6,1,5);
plot2d(fr',xm') ; xtitle ('AFR')

n=0:255;

x =[0 1 zeros(1,255)  ];
res =filter(hb,ha,x);
subplot (6,1,1);
plot2d(n,  x(n+1)      )      ;  xtitle (' Input signal ')
subplot (6,1,2);
plot2d(n,  res(n+1)      )      ;  xtitle (' Impulse response ')

x=[1 ones(1,255)  ];
res =filter(hb,ha,x);
subplot (6,1,3);
plot2d(n,  x(n+1)      )      ;  xtitle (' Input signal ')
subplot (6,1,4);
plot2d(n, res(n+1)     ) ; xtitle ('Step  response ')







 ha=[1 -1.611942  0.631574];
 hb=[1 0.603896 -0.396104];


[xm,fr]=frmag(hb,ha,512);
subplot(6,1,5);
plot2d(fr',xm'  ) ; xtitle ('AFR')

n=0:255;

x =[  1 zeros(1,255)  ];
res =filter(hb,ha,x);
subplot (6,1,1);
plot2d(n,  x(n+1)       )      ;  xtitle (' Input signal ')
subplot (6,1,2);
plot2d(n,  res(n+1)       )      ;  xtitle (' Impulse response ')

x=[  1 ones(1,255)  ];
res =filter(hb,ha,x);
subplot (6,1,3 );
plot2d(n,  x(n+1)    )      ;  xtitle (' Input signal ')
subplot (6,1,4);
plot2d(n, res(n+1)     )  ; xtitle ('Step  response ')
Добавлено через 31 секунду
Исправить ha=[1 -1.611942 0.631574]; hb=[1 0.603896 -0.396104]; из статьи на правильные .

Добавлено через 1 час 27 минут
Код
U0=0;
U01=0;
  
Uinp=0;
R=22e3;
C=4.7e-9;
 Hprev=256;
 Hprev1=256;
t=0;



x=[0 0.5 0 0 0 0 0 0 0 0  0  0  0  0  0  0  1  2  1  0 ];
xq = 0;
q=zeros(1:20);





function y=GetHigh ( H   )
y= bitand(H,hex2dec('FF00') )/256
endfunction

function y=GetLow (H)
y=bitand (H,hex2dec('00FF'))   
endfunction

function dh=Get_dH ( q  , n )
 
if (n>=4) 
then 

     if   (q (n)==q(n-1))&& (q(n-1)==q(n-2))&&(q(n-2)==q(n-3))   then dh=2  else dh=0 end    

else  dh=0 
 
end 

 

endfunction



function st =Get_Step (q, n )

dh1=Get_dH (q, n )*256;
dec1=GetHigh (Hprev )

if (Hprev <= 256)  then   begin dec1=0;  Hprev=256     end; 
if(Hprev>=hex2dec('FF00') )  then dh1=0 end 

Hprev =Hprev-dec1+dh1;                

st =GetHigh ( Hprev ) 
endfunction


function strx =Get_Step1 (q, n )

dh2=Get_dH (q, n )*256;
dec2=GetHigh (Hprev1 )

if (Hprev1 <= 256)  then   begin dec2=0;  Hprev1=256     end; 
if(Hprev1>=hex2dec('FF00') )  then dh1=0 end 

Hprev1 =Hprev1-dec2+dh2;                

strx =GetHigh ( Hprev1 ) 
endfunction

function y=Uin_int(t, Uin)
y=Uin
endfunction
 

function y=sign1(x1)
if (x1>0) y= 1 else y=-1 end

endfunction


function q=Compare(x1,x2 )
q = sign1( (x1 - x2)   )    ;
endfunction 



hb=[ 1  0.603896 -0.396104 ];
ha=[  1 -1.544282  -0.567961   ];



function Uint=IntegrTx( Uinp )


   U0=U0+ (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
//  Uint=filter(hb,ha, Uinp );  
  Uint =U0
endfunction 



 hb1=[1 0.603896 -0.396104]; 
 ha1=[1 -1.611942  0.631574];


function Uint1=IntegrRx( Uinp )


  U01=U01+  (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 //  U01=filter(hb1,ha1, Uinp );  
  Uint1=U01
endfunction 



for n = 1:20
xsig=x(n);
q(n) =Compare(xsig, xq );
 
 st1=1;   //=1 for LDM

 //st1= Get_Step ( q, n ) ;   // for ADM 
st2(n)=st1;

Uinp =q(n)*st1;

xq=IntegrTx( Uinp );

Uxp(n)=xq;

end

subplot(8,2,1) 
plot2d2( q ); xtitle ('q')
subplot(8,2,3) 
plot2d2( x ) ; xtitle ('x')
subplot(8,2,5)
 plot2d  (  Uxp)  ; xtitle ('xq')
subplot(8,2,7)
plot2d2 ( st2 )  ; xtitle ('st2')



for n = 1:20
 
 
  st3=1;   //=1 for LDM

// st3= Get_Step1 ( q, n ) ;    //   for ADM 
st4(n)=st3;

 

Uxout(n)=IntegrRx( q(n)*st3);
  
end

subplot(8,2,2) 
plot2d2( q ); xtitle ('q')
 
subplot(8,2,6)
 plot2d  (   Uxout)  ; xtitle ('Uxout')

 
subplot(8,2,8)
plot2d2 ( st4 )  ; xtitle ('st4')
Добавлено через 18 секунд
Для ЛДМ

Добавлено через 7 минут
В программе, кажется, что-то с запоминанием предыдущих начальных условий из предыдущего такта ( Uint1=U01 и Uint =U0)

Добавлено через 29 секунд
Временно включена в режим ЛДМ (шаг =1 )
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
03.05.2019, 07:31  [ТС] 16
https://stackoverflow.com/questions/...lobal-variable про статические переменные (или глобальные как их менее удобный аналог , размещаемый вне подпрограммы ) .

Добавлено через 3 часа 30 минут

Про скремблирование (правильно ли сброс после последовательно принятого каждого байта с записью в нулевой разряд принятого бита и сдвигом предыдущих влево в старшие разряды )
Код
 //SciLab script
 
global y_scr  ;
global x_scr  ; 
  y_scr=0;
  x_scr=0;

function  yn=Scremble( xn  )
//ys(0)=xn(0) xor ys(0-6) xor ys(0-7)
global y_scr 

 w=uint8(y_scr); 
 y_scr =uint8(w+y_scr); //shift left y 1 bit , zero in the bit 0 , 
                                    // may be written  on the  assembler comand for shift   left  
 
 w= uint8 (bitand( uint8(xn) , 1))  ;
 temp_bit= uint8(bitget(y_scr, 8));
 w= uint8(bitxor(   w  ,  temp_bit) );
 temp_bit= uint8(bitget(y_scr, 7)); 
 w= uint8(bitxor(   w  ,  temp_bit  ) ) ;
 y_scr= uint8(bitor( uint8(y_scr) , uint8(w)  ) )   ; //append  

 disp('y_scr='+string(dec2bin(y_scr)))
yn=uint8(bitand( y_scr, 1));



endfunction 



function  y_nd=Descremble( xn  )

//yd(0)=xn(0) xor xn(0-6) xor xn(0-7)
global x_scr  

w=uint8( x_scr );
x_scr=uint8(w+x_scr );   //shift left xn
w= uint8(bitand(uint8(xn), 1));
x_scr=uint8(bitor( w,   x_scr  )); // append bit x
 disp('x_scr='+string(dec2bin(x_scr)))

w =uint8(bitget(x_scr,1));
tmp_bit=uint8( bitget(x_scr, 8 )); //bit 7 
w=uint8(bitxor( w ,    tmp_bit ));
tmp_bit=uint8( bitget(x_scr, 7 )); //bit 6
w=uint8(bitxor(w  ,   tmp_bit )); 

y_nd=uint8(bitand( w, 1)); 
endfunction 


 
 



xn =[ 1 0  1  1  0  0 1   1       0  0  0    1  1  1  0 ]; 
    y_scr=0;
    x_scr=0;
for n=1:15
if   modulo(n-1,8)==0 then 
//  reset every byte , check rule
    y_scr=0;
     x_scr=0;
end

  x =uint8(xn(n) );
  ys =Scremble( uint8(xn(n) )  );
  yd =Descremble( ys  );
 disp('n='+string(n)+' x='+string(x)+' yscr='+string(ys) +' ydes='+string(yd) )
end
Добавлено через 2 часа 52 минуты
Вариант кодека

Код
//SciLab script
  


  

function y=GetHigh ( H   )   
y=uint8 (bitand(H,hex2dec('FF00') )/256)      
endfunction

function y=GetLow (H)   
y=uint8(bitand (H,hex2dec('00FF')))                  
endfunction

global qtmp;
qtmp(4)=0;
qtmp(3)=0;
qtmp(2)=0;
qtmp(1)=0; 

function  h=Get_dH (q)
 global qtmp;

qtmp(4)=qtmp(3);
qtmp(3)=qtmp(2);
qtmp(2)=qtmp(1);
qtmp(1)=q  ;
   if   (qtmp (4)==qtmp(3))&& (qtmp(3)==qtmp(2))&&(qtmp(2)==qtmp(1))   
                          then  
                           h=2  
                          else  h=0  
            end    
  
end 

endfunction


global Hprevh;
global Hprevl;
 Hprevh=0;
 Hprevl=0;

function st =Get_Step ( q  )

global Hprevh;
global Hprevl;
 dh1=  Get_dH (q  )  ;
Hmin=1;
//fix 3F and Hmin 
 if(Hprevh>= hex2dec('3F') )  then dh1=0 end   
if (Hprevh < Hmin)  then   
                                            
                                           
                                            Hprevh =Hmin;  
                                            Hprevl =0 
                                            
else 

Hprevh=Hprevh+dh1;
Hprevl=Hprevl-Hprevh;
  
end

st  =  Hprevh ;
endfunction



global qtmp1;
qtmp1(4)=0;
qtmp1(3)=0;
qtmp1(2)=0;
qtmp1(1)=0; 

function  dh1=Get_dH1 (q1)
 global qtmp1;

qtmp1(4)=qtmp1(3);
qtmp1(3)=qtmp1(2);
qtmp1(2)=qtmp1(1);
qtmp1(1)=q1  ;
   if   (qtmp1 (4)==qtmp1(3))&& (qtmp1(3)==qtmp1(2))&&(qtmp1(2)==qtmp1(1))   
                          then  dh1=2  
                          else  dh1=0 
                        end    
  
end 

endfunction



global Hprev1h;
global Hprev1l;
Hprev1h=0;
 Hprev1l=0;

function st1 =Get_Step1 (q  )

global Hprev1h;
global Hprev1l;
dh2=  Get_dH1 ( q  ) ;
Hmin1=1;

//fix 3F and Hmin1

if(Hprev1h>hex2dec('3F') )  then dh2=0 end 
if (Hprev1h <Hmin1)  then   
                                              
                                           
                                            Hprev1h =Hmin1;  
                                            Hprev1l =0 
                                          else 

Hprev1h=Hprev1h+dh2;
Hprev1l=Hprev1l-Hprev1h;
end         

st1 =  Hprev1h ;
endfunction


function y=Uin_int(t, Uin)  
y=Uin   
endfunction
function y=sign1(x1)   
if (x1>0) y= 1 else y=-1 end  
endfunction

function q=Compare(x1,x2 )   
q = sign1( (x1 - x2)   )         
endfunction 



hb=[ 1  0.603896 -0.396104 ];
ha=[  1 -1.544282  -0.567961   ];




 

global U0 ;
U0=0;

function Uint=IntegrTx( Uinp )
global U0 ;
R=15e3;
C=4.7e-9;
  U0=U0+ (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);  
  Uint =U0
// Uint=filter(hb,ha, Uinp );  
endfunction 



 hb1=[1 0.603896 -0.396104]; 
 ha1=[1 -1.611942  0.631574];

global U01 ;
U01 =0;
function Uint1=IntegrRx( Uinp )
global U01 ;
R=15e3;
C=4.7e-9;
 U01=U01+  (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 Uint1=U01
   //Uint1=filter(hb1,ha1, Uinp );  
   
endfunction 



x=[0  0  0  -2 5 1 1 1 -2  0  0  0  0  0 2  1  1  0  0  0 ];

t=0;





 


//Coder

xq = 0;


for n = 1:20

xsig=x(n);
q =Compare(xsig, xq );     
  q_out(n)=q; 
  

    st_1=   Get_Step ( q   )  ;   // for ADM 
st2(n)=st_1;


Uin_tx=( q*st_1); // fix scale 
xq=IntegrTx(  Uin_tx  );

Uxp(n)=xq;

end

n=1:20;
subplot(8,1,1) 
plot2d2( n-1, q_out(n) ); xtitle ('q')
subplot(8,1,2) 
plot2d2  ( n-1,  x(n))  ; xtitle ('x_n')

subplot(8,1,3)
 plot2d2  ( n-1,  Uxp(n))  ; xtitle ('Uxp')
 
subplot(8,1,4)
plot2d2 (n-1, st2(n) )  ; xtitle ('st2')





//Decoder
for n = 1:20
 
qrx=q_out(n);
    
               
 
     st_3=  Get_Step1 ( qrx  )  ;    //   for ADM 
 st4(n)=st_3;


Uin_rx=(qrx*st_3);  //fix scale 
yrx=IntegrRx( Uin_rx );
  Uxout(n)=yrx;



end


n = 1:20; 

 subplot(8,1,5) 
plot2d2( n-1, q_out(n) ); xtitle ('q')
subplot(8,1,6)
 plot2d2  ( n-1,  Uxout(n))  ; xtitle ('Uxout')
 
subplot(8,1,7)
plot2d2 (n-1, st4(n) )  ; xtitle ('st4')
Добавлено через 51 минуту
Для сопряжения аналоговой и цифровой (здесь без длительностного кодирования ) форм ввести функции :

Код
function y=getdig( x)
if x>0 then y=1 else y=0
endfunction

function y=getanalog( x)
if x>0 then y=1 else y=-1  //ввести масштаб 
endfunction
Добавлено через 2 часа 18 минут
Код



 

  

function y=GetHigh ( H   )   
y=uint8 (bitand(H,hex2dec('FF00') )/256)      
endfunction

function y=GetLow (H)   
y=uint8(bitand (H,hex2dec('00FF')))                  
endfunction

global qtmp;
qtmp(4)=0;
qtmp(3)=0;
qtmp(2)=0;
qtmp(1)=0; 

function  h=Get_dH (q)
 global qtmp;

qtmp(4)=qtmp(3);
qtmp(3)=qtmp(2);
qtmp(2)=qtmp(1);
qtmp(1)=q  ;
   if   (qtmp (4)==qtmp(3))&& (qtmp(3)==qtmp(2))&&(qtmp(2)==qtmp(1))   
                          then  
                           h=2  
                          else  h=0  
            end    
  
  

endfunction


global Hprevh;
global Hprevl;
 Hprevh=0;
 Hprevl=0;

function st =Get_Step ( q  )

global Hprevh;
global Hprevl;
 dh1=  Get_dH (q  )  ;
Hmin=1;
 if(Hprevh>= hex2dec('3F') )  then dh1=0 end   
if (Hprevh < Hmin)  then   
                                            
                                           
                                            Hprevh =Hmin;  
                                            Hprevl =0 
                                            
else 

Hprevh=Hprevh+dh1;
Hprevl=Hprevl-Hprevh;
  
end

st  =  Hprevh ;
endfunction



global qtmp1;
qtmp1(4)=0;
qtmp1(3)=0;
qtmp1(2)=0;
qtmp1(1)=0; 

function  dh1=Get_dH1 (q1)
 global qtmp1;

qtmp1(4)=qtmp1(3);
qtmp1(3)=qtmp1(2);
qtmp1(2)=qtmp1(1);
qtmp1(1)=q1  ;
   if   (qtmp1 (4)==qtmp1(3))&& (qtmp1(3)==qtmp1(2))&&(qtmp1(2)==qtmp1(1))   
                          then  dh1=2  
                          else  dh1=0 
                        end    
  
 

endfunction



global Hprev1h;
global Hprev1l;
Hprev1h=0;
 Hprev1l=0;

function st1 =Get_Step1 (q  )

global Hprev1h;
global Hprev1l;
dh2=  Get_dH1 ( q  ) ;
Hmin1=1;


if(Hprev1h>hex2dec('3F') )  then dh2=0 end 
if (Hprev1h <Hmin1)  then   
                                              
                                           
                                            Hprev1h =Hmin1;  
                                            Hprev1l =0 
                                          else 

Hprev1h=Hprev1h+dh2;
Hprev1l=Hprev1l-Hprev1h;
end         

st1 =  Hprev1h ;
endfunction


function y=Uin_int(t, Uin)  
y=Uin   
endfunction
function y=sign1(x1)   
if (x1>0) y= 1 else y=-1 end  
endfunction

function q=Compare(x1,x2 )   
q = sign1( (x1 - x2)   )         
endfunction 



hb=[ 1  0.603896 -0.396104 ];
ha=[  1 -1.544282  -0.567961   ];




 

global U0 ;
U0=0;

function Uint=IntegrTx( Uinp )
global U0 ;
R=15e3;
C=4.7e-9;
  U0=U0+ (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);  
  Uint =U0
// Uint=filter(hb,ha, Uinp );  
endfunction 



 hb1=[1 0.603896 -0.396104]; 
 ha1=[1 -1.611942  0.631574];

global U01 ;
U01 =0;
function Uint1=IntegrRx( Uinp )
global U01 ;
R=15e3;
C=4.7e-9;
 U01=U01+  (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 Uint1=U01
   //Uint1=filter(hb1,ha1, Uinp );  
   
endfunction 



x=[0  0  0  -2 5 1 1 1 -2  0  0  0  0  0 2  1  1  0  0  0 ];

t=0;





 


//Coder

xq = 0;


for n = 1:20

xsig=x(n);
q =Compare(xsig, xq );     
  q_out(n)=q; 
  

    st_1=   Get_Step ( q   )  ;   // for ADM 
st2(n)=st_1;


Uin_tx=( q*st_1);
xq=IntegrTx(  Uin_tx  );

Uxp(n)=xq;

end

n=1:20;
subplot(8,1,1) 
plot2d2( n-1, q_out(n) ); xtitle ('q')
subplot(8,1,2) 
plot2d2  ( n-1,  x(n))  ; xtitle ('x_n')

subplot(8,1,3)
 plot2d2  ( n-1,  Uxp(n))  ; xtitle ('Uxp')
 
subplot(8,1,4)
plot2d2 (n-1, st2(n) )  ; xtitle ('st2')
//****************************************************

function yd=getdigital( xa)
if xa>0 then 
 yd=1 
else yd=0
end
endfunction

function ya=getanalog( xd)
if xd>0 then 
 ya=1
else ya=-1  //fix for 0V/5V
end
endfunction


global y_scr  ;
global x_scr  ; 
  y_scr=0;
  x_scr=0;





function  yn=Scremble( xn  )
//ys(0)=xn(0) xor ys(0-6) xor ys(0-7)
global y_scr 

 w=uint8(y_scr); 
 y_scr =uint8(w+y_scr); //shift left y 1 bit , zero in the bit 0
 
 w= uint8 (bitand( uint8(xn) , 1))  ;
 temp_bit= uint8(bitget(y_scr, 8));
 w= uint8(bitxor(   w  ,  temp_bit) );
 temp_bit= uint8(bitget(y_scr, 7)); 
 w= uint8(bitxor(   w  ,  temp_bit  ) ) ;
 y_scr= uint8(bitor( uint8(y_scr) , uint8(w)  ) )   ; //append  

// disp('y_scr='+string(dec2bin(y_scr)))
yn=uint8(bitand( y_scr, 1));



endfunction 




function  y_nd=Descremble( xn  )

//yd(0)=xn(0) xor xn(0-6) xor xn(0-7)
global x_scr  

w=uint8( x_scr );
x_scr=uint8(w+x_scr );   //shift left xn
w= uint8(bitand(uint8(xn), 1));
x_scr=uint8(bitor( w,   x_scr  )); // append bit x
 //disp('x_scr='+string(dec2bin(x_scr)))

w =uint8(bitget(x_scr,1));
tmp_bit=uint8( bitget(x_scr, 8 )); //bit 7 
w=uint8(bitxor( w ,    tmp_bit ));
tmp_bit=uint8( bitget(x_scr, 7 )); //bit 6
w=uint8(bitxor(w  ,   tmp_bit )); 

y_nd=uint8(bitand( w, 1)); 
endfunction 
//**************************

//q_out =[ 1 0  1  1  0  0 1   1       0  0  0    1  1  1  0 ]; 

   y_scr=0;
    x_scr=0;
for n=1:20

    if   modulo(n-1,8)==0 then 
 
      y_scr=0;
       x_scr=0;
     end
x_d1=getdigital( q_out(n));
x =uint8( x_d1)  ;

  ys =Scremble(  x );

//ys--->--tau_code--line--tau_decode->-ATS->- tau_decode-->line--> decode_tau-->ys


  yd =Descremble( ys  );
 yd1(n)=yd;
q_outrx(n)=getanalog( yd) ; 
 disp('n='+string(n)+' x='+string(x)+' yscr='+string(ys) +' ydes='+string(yd1(n)) )
end 





//*****************************************************
 
 
//Decoder
for n = 1:20
 
   //qrx=q_out(n);
    
   qrx=q_outrx(n)   ;                          
 
     st_3=  Get_Step1 ( qrx  )  ;    //   for ADM 
 st4(n)=st_3;


Uin_rx=(qrx*st_3);
yrx=IntegrRx( Uin_rx );
  Uxout(n)=yrx;



end


n = 1:20; 

 subplot(8,1,5) 
plot2d2( n-1, q_outrx(n) ); xtitle ('qout rx')
subplot(8,1,6)
 plot2d2  ( n-1,  Uxout(n))  ; xtitle ('Uxout')
 
subplot(8,1,7)
plot2d2 (n-1, st4(n) )  ; xtitle ('st4')
Добавлено через 4 минуты
Нужно ли в
Код
 hex2dec('3F') )
ставить в '08', а Hmin,Hmin1= 0x02 ? Фильтры из статьи http://gea.nmu.org.ua/docs/2014/2/93_072-076.pdf не работают .

Добавлено через 1 минуту
Hmin,Hmin1 должны быть больше нуля, из состояния ноль автовыводиться подпрограммой ограничения пределов с начального такта .
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
09.05.2019, 04:43  [ТС] 17
Интересно , а как в ITU пишут название сети С-32 (С-32 (транслитерируя ), S-32 (от system) ) при документированиях кодека ?
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
17.05.2019, 07:00  [ТС] 18
Уточнение

в выражении
Код
Hprevh=Hprevh+dh1;
Hprevl=Hprevl-Hprevh;
нужно учитывать особенности заема из Hprevh при декрементировании дробной части Hprevl и округлении до 8 разрядов (выделение 8 старших байтов в виде Hprevh ).


Код

	
Добавлено через 19 минут
реализовать принцип
Код
Hh [n].Hl[n]= Hh [n-1].Hl[n-1]-0.Hh [n-1]+dH[n].0
где Hl[n] -"дробная" часть 16-битного числа Hh [n].Hl[n],
Hh [n]- целая часть 16-битного числа, используется как результат

Добавлено через 12 минут
( псевдокод, концептуально, исправить , если неправильно )
Код
Hh [n]=GetHigh(  uint16_H[n])
Hl  [n]=GetLow (  uint16_H[n])

//Hh [n].Hl[n]= Hh [n-1].Hl[n-1]-0.Hh [n-1]+dH[n].0


//uint16_H[n]=Hh[n]*256+Hl[n]

//uint16_H[n ]=uint16_H[n-1]-(uint16_H[n-1]/256)+dH[n]*256

uint16_H =uint16_H -((uint16_H & 0xFF00)/256)+dH *256


//result= (uint16_H & 0xFF00)/256

result=GetHigh(uint16_H)
0
USERPC01
-33 / 0 / 0
Регистрация: 29.06.2018
Сообщений: 392
Вчера, 02:43  [ТС] 19
Если привести к следующему виду , похожему на формулу , как в публикации , то

Код


 

  

function y=GetHigh ( H   )   
y=uint8 (bitand(H,hex2dec('FF00') )/256)      
endfunction

function y=GetLow (H)   
y=uint8(bitand (H,hex2dec('00FF')))                  
endfunction

global qtmp0;
qtmp0(4)=0;
qtmp0(3)=0;
qtmp0(2)=0;
qtmp0(1)=0; 

function  htx=Get_dHtx (qx)
 global qtmp0;

qtmp0(4)=qtmp0(3);
qtmp0(3)=qtmp0(2);
qtmp0(2)=qtmp0(1);
qtmp0(1)=qx  ;
   if   (qtmp0 (4)==qtmp0(3))&& (qtmp0(3)==qtmp0(2))&&(qtmp0(2)==qtmp0(1))   
                          then  
                           htx=2  
                          else  htx=0  
            end    
  
  

endfunction


 
global H_1 ;
 H_1 =1;
 
function st0 =Get_Step0  (q  )

global H_1 ;
 
dh1=  Get_dHtx ( q  ) ;
Hmin0=1;
Hmax0=hex2dec('3F');

if (H_1 >=Hmax0*256 )  then dh1=0 end 

H_1 =  H_1- (uint16(bitand(hex2dec('FF00'), H_1) /256))+(dh1*256);

if ( H_1<= (Hmin0*256) )   then H_1  =Hmin0*256   end  ;
 
st0 =1.0*  floor(H_1 /256);
endfunction




global qtmp1;
qtmp1(4)=0;
qtmp1(3)=0;
qtmp1(2)=0;
qtmp1(1)=0; 

function  dh1=Get_dH1 (q1)
 global qtmp1;

qtmp1(4)=qtmp1(3);
qtmp1(3)=qtmp1(2);
qtmp1(2)=qtmp1(1);
qtmp1(1)=q1  ;
   if   (qtmp1 (4)==qtmp1(3))&& (qtmp1(3)==qtmp1(2))&&(qtmp1(2)==qtmp1(1))   
                          then  dh1=2  
                          else  dh1=0 
                        end    
  
 

endfunction



global H_2 ;
 
H_2 =1;
   

function st1 =Get_Step1 (q  )

global H_2 ;
 
dh2=  Get_dH1 ( q  ) ;
Hmin1=1;
Hmax1=hex2dec('3F');

if (H_2 >=Hmax1*256 )  then dh2=0 end 

H_2 =  H_2- (uint16(bitand(hex2dec('FF00'), H_2 ) / 256) )+(dh2*256);

if ( H_2 <= (Hmin1*256) )   then H_2  =Hmin1*256   end  ;
 
st1 =1.0*  floor(H_2 /256);
endfunction


function y=Uin_int(t, Uin)  
y=Uin   
endfunction
function y=sign1(x1)   
if (x1>0) y= 1 else y=-1 end  
endfunction

function q=Compare(x1,x2 )   
q = sign1( (x1 - x2)   )         
endfunction 



hb=[ 1  0.603896 -0.396104 ];
ha=[  1 -1.544282  -0.567961   ];




 

global U0 ;
U0=0;

function Uint=IntegrTx( Uinp )
global U0 ;
R=15e3;
C=4.7e-9;
  U0=U0+ (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);  
  Uint =U0
// Uint=filter(hb,ha, Uinp );  
endfunction 



 hb1=[1 0.603896 -0.396104]; 
 ha1=[1 -1.611942  0.631574];

global U01 ;
U01 =0;
function Uint1=IntegrRx( Uinp )
global U01 ;
R=15e3;
C=4.7e-9;
 U01=U01+  (1/(R*C))*integrate('Uin_int(t, Uinp)','t',0, 31.25e-6);
 Uint1=U01
   //Uint1=filter(hb1,ha1, Uinp );  
   
endfunction 



x=[0  0  0  -2 5 1 1 2  2  0  0  0  0  0 0  0  0  0  0  0 ];

t=0;





 


//Coder

xq = 0;


for n = 1:20

  xsig=x(n);
  q =Compare(xsig, xq );     
  q_out(n)=q; 
  qin=q_out(n) ;

    st_1=double(1.0*Get_Step0 (qin ) ) ;   // for ADM 
    st2(n)=st_1;
   

   Uin_tx=( q*st_1);
   xq=IntegrTx(  Uin_tx  );

Uxp(n)=xq;

end

n=1:20;
subplot(8,1,1) 
plot2d2( n-1, q_out(n) ); xtitle ('q')
subplot(8,1,2) 
plot2d2  ( n-1,  x(n))  ; xtitle ('x_n')

subplot(8,1,3)
 plot2d2  ( n-1,  Uxp(n))  ; xtitle ('Uxp')
 
subplot(8,1,4)
plot2d2 (n-1, st2(n) )  ; xtitle ('st2')
//****************************************************

function yd=getdigital( xa)
if xa>0 then 
 yd=1 
else yd=0
end
endfunction

function ya=getanalog( xd)
if xd>0 then 
 ya=1
else ya=-1  //fix for 0V/5V
end
endfunction


global y_scr  ;
global x_scr  ; 
  y_scr=0;
  x_scr=0;





function  yn=Scremble( xn  )
//ys(0)=xn(0) xor ys(0-6) xor ys(0-7)
global y_scr 

 w=uint8(y_scr); 
 y_scr =uint8(w+y_scr); //shift left y 1 bit , zero in the bit 0
 
 w= uint8 (bitand( uint8(xn) , 1))  ;
 temp_bit= uint8(bitget(y_scr, 8));
 w= uint8(bitxor(   w  ,  temp_bit) );
 temp_bit= uint8(bitget(y_scr, 7)); 
 w= uint8(bitxor(   w  ,  temp_bit  ) ) ;
 y_scr= uint8(bitor( uint8(y_scr) , uint8(w)  ) )   ; //append  

// disp('y_scr='+string(dec2bin(y_scr)))
yn=uint8(bitand( y_scr, 1));



endfunction 




function  y_nd=Descremble( xn  )

//yd(0)=xn(0) xor xn(0-6) xor xn(0-7)
global x_scr  

w=uint8( x_scr );
x_scr=uint8(w+x_scr );   //shift left xn
w= uint8(bitand(uint8(xn), 1));
x_scr=uint8(bitor( w,   x_scr  )); // append bit x
 //disp('x_scr='+string(dec2bin(x_scr)))

w =uint8(bitget(x_scr,1));
tmp_bit=uint8( bitget(x_scr, 8 )); //bit 7 
w=uint8(bitxor( w ,    tmp_bit ));
tmp_bit=uint8( bitget(x_scr, 7 )); //bit 6
w=uint8(bitxor(w  ,   tmp_bit )); 

y_nd=uint8(bitand( w, 1)); 
endfunction 
//**************************

//q_out =[ 1 0  2  2  2  0 0   0       0  0  0    0  0  0  0 ]; 

   y_scr=0;
    x_scr=0;
for n=1:20

    if   modulo(n-1,8)==0 then 
 
      y_scr=0;
       x_scr=0;
     end
x_d1=getdigital( q_out(n));
x =uint8( x_d1)  ;

  ys =Scremble(  x );

//ys--->--tau_code--line--tau_decode->-ATS->- tau_decode-->line--> decode_tau-->ys


  yd =Descremble( ys  );
 yd1(n)=yd;
q_outrx(n)=getanalog( yd) ; 
 disp('n='+string(n)+' x='+string(x)+' yscr='+string(ys) +' ydes='+string(yd1(n)) )
end 





//*****************************************************
 
 
//Decoder
for n = 1:20
 
   //qrx=q_out(n);
    
   qrx=q_outrx(n)   ;                           
 
     st_3=double(1.0*  Get_Step1 ( qrx  ) ) ;    //   for ADM 
 st4(n)=st_3;


Uin_rx=(qrx*st_3);
yrx=IntegrRx( Uin_rx );
  Uxout(n)=yrx;



end


n = 1:20; 

 subplot(8,1,5) 
plot2d2( n-1, q_outrx(n) ); xtitle ('qout rx')
subplot(8,1,6)
 plot2d2  ( n-1,  Uxout(n))  ; xtitle ('Uxout')
 
subplot(8,1,7)
plot2d2 (n-1, st4(n) )  ; xtitle ('st4')

Некачественно декрементирует шаг при продолжительной постоянности сигнала , но на резкое увеличение сигнала на некоторое время инкрементированием шага квантования реагирует .


Кажется, уменьшение шага с помощью (H_1&0xFF00)*(2^-8) , где x*(2^-8)= x /256 сдвиг на байт в сторону младших разрядов (вправо) , если долго dh=0 , происходит неправильно, возможно из-за проблем с приведенными типами или неправильной формулой в статье .
0
Вчера, 02:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Вчера, 02:43

Кодер и декодер на ATtiny2313
кто нибудь делал подобное? http://rodyokot.ru/circuit/digital/outomat/23/

UUE кодер\декодер
Доброго времени суток! Возникла потребность написать на C# кодер и декорер UUE, но я не...

Кодер-Декодер Хемминга.
Кодер: #include &lt;iostream&gt; unsigned char xr (unsigned char c) { int d; unsigned char s=0;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru