Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 2
1

Квантование сигнала

20.11.2018, 16:42. Просмотров 1050. Ответов 2

Такая задача - Задается непрерывный сигнал в виде sin(Pi*t). Необходимо произвести квантование этого сигнала по уровню и по времени, ну т.е. получить цифровой сигнал. Эту задачу я практически решил, но столкнулся с несколькими проблемами. При значения tk (шага дискретизации по времени) = 0.5 с, и h (шаг, на который увеличивается время на каждой итерации) = 0.001 с, вроде бы все работает как положено. Но стоит изменить шаг дискретизации и все ломается. А мне нужно tk = 0,01 c.

Алгоритм программы следующий:
1) Вычисляю значение входного сигнала Uv на текущем значении t.
2) Округляю значение сигнала Uv до целого, тем самым получая уровень квантования (Uo).
3) Проверяю текущее значение t на кратность шагу дискретизации. (t/tk); вывод остатка от деления; если остаток = 0, то текущее t = какому то по счету шагу дискретизации.
4) Далее проверяю идет ли функция на возрастание или убывание, и в зависимости от этого рисую линии уже квантованного сигнала.
5) увеличиваю время t:= t + h;

Так вот, суть проблемы. Когда ставлю tk = 0.01, то сигнал квантуется только до t = 1 c. Прогонял через отладчик. И просто не понимаю как так возможно. Дальше все считается точно так же и вроде бы даже правильно, но почему то условия не проходят проверку. Т.е. Вычисляет остаток от деления a:= t / tk; a получается = 0. Но при проверки условия if (a = 0), паскаль просто его проскакивает мимо, как будто а <> 0. В чем прикол?

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
uses
  GraphABC;
 
const
  pi = 3.14;
  h = 0.001;      // шаг увеличения времени
  tk = 0.5;       // шаг дискретизации
  k = 30;       // масштаб
  Lmax = 8;
  tmax = 15;
  g = 1;      // масштаб для оси t
  
var
  x0, y0, r1, r2, L, tmp, Uo, b : integer;
  t, a : real;
  Uv: real;
  
  
 procedure OS;        // процедура рисования осей
 
  begin
    setwindowsize(900, 900);
    SetPenWidth(2);
    { Начало координат: }
    x0 := 50; 
    y0 := WindowHeight div 2; //половина высоты окна
    Line(x0, y0, x0 + 830, y0); //ось OX 
    Line(x0, y0 - 430, x0, y0 + 430); //ось OY
    
    line(880,450,860,440);
    line(880,450,860,460);
    Textout(870,460,' t ');
    line(50,20,40,40);
    line(50,20,60,40);
    Textout(70,20,' U ');
    SetPenWidth(1);
   
    for i: integer :=1 to tmax do
   
      begin
        line(x0 + i * g*k, y0 + 10, x0 + i * g*k, y0 - 5);
        textout(x0 + i * g*k, y0 - 25, inttostr(i));
      end;
      
    for i: integer :=1 to 10 do  
        if i <> 0 then 
      begin
            line(x0 + 8, y0 + i * k, x0 - 5, y0 + i * k);
            line(x0 + 8, y0 - i * k, x0 - 5, y0 - i * k);
            textout(x0 - 20, y0 - i * k, inttostr(i));
            textout(x0 - 20, y0 + i * k, inttostr(i));
      end;    
      
 
  end;
  
  
  
  Begin
  
    OS;                       // рисуем ОСИ координат
    
    Uo := 0;                 // начальное значение напряжения обратной связи
    t:= 0;                 // обнуляем время перед циклом
    tmp:= 0;              // предыдущий уровень квантования
    
    repeat
    
     Uv := Lmax*sin(-Pi*t/6);               // входной сигнал Uv(t)
        r1:= round (x0 + t*g*k);
        r2:= round (y0 + Uv*k);
        setpixel(r1,r2,rgb(255,0,0));     // рисуем график изменения входного сигнала во времени ;
      
      
     Uo:= round(Uv);                    // квантование по уровню
      
        if (Uo < -Lmax) then Uo:= -Lmax;
        if (Uo > Lmax) then Uo:= Lmax;
      
     L:= round (y0 + Uo*k);     // координата уровня квантования
       
     a:= frac (t / tk);         // проверка на кратность шагу дескритизации
     a:= round(a,2);  
     b:= abs(Uo-tmp);  
       
     if (a = 0) and (tmp > Uo)  then              // возрастание
        line(r1,L,r1,L+k*b);                       // слева сверху - вниз
        
     if (a = 0) and (tmp < Uo) then              // убывание
        line(r1,L,r1,L-k*b);                      // слева снизу - вверх
       
      
     if (a = 0) then
       begin
        line(r1,L,r1+round(tk*g*k),L);
        tmp:= Uo;
       end;
      
      
      t:= t + h; 
      
    until t > tmax;
    
  END.

P.s. Для того чтобы, график был читабельным при tk = 0.01 с., нужно изменить масштаб оси времени - в константах поменять значение "g" с 1 - на 8. И в 69 строке убрать из формулы "/6".
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2018, 16:42
Ответы с готовыми решениями:

Квантование сигнала
Привет всем! Эта темя является продолжением этой В конце предыдущей работы написал...

Квантование дискретного сигнала
Подскажите как произвести квантование дискретного сигнала с выбранной по пункту d частотой,...

Квантование дискретизированного сигнала
Если произвести поэлементное умножение квантованного синуса на шаг квантования dQ(n) при данной...

Квантование сигнала. Теорема Котельникова
Нужна помощь читал информацию по теореме все равно недопонимаю. Объясните пожалуйста если имеются...

2
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 2
21.11.2018, 23:57  [ТС] 2
Короче я разобрался сам, почему паскаль пропускает условие. Просто каким то магическим образом в числа записывается дохрена нулей. Типо, t:= t + 0.1; в результат записывается не 0.1 , а 0.100000000000000000.
0
1315 / 712 / 330
Регистрация: 07.04.2017
Сообщений: 2,950
22.11.2018, 00:53 3
Там на конце еденица должна быть. Это погрешность чисел с плавающей запятой.

Так писать:
Pascal
1
2
3
4
5
6
7
begin
  var x,y: real;
  
  //ToDo заполнение
  
  if x = y then
end.
Считается плохим стилем. Потому что в каждом языке (даже на ассемблере) числа с плавающей запятой сохраняются с погрешностью.

Вместо этого надо писать так:
Pascal
1
2
3
4
5
6
7
begin
  var x,y: real;
  
  //ToDo заполнение
  
  if abs(x-y) < 0.001 then
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2018, 00:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Квантование сигналов
Помогите пожалуйста решить вот такую задачу: Есть заданный сигнал в форме функции так же...

Квантование строки пикселей
Доброго времени суток. Имеется следующее задание из лабораторной работы: Взять фотографию...

Квантование яркости изображения
Необходимо создать программу, которая производит квантование яркости монохромного изображения по...

Неравномерное квантование яркости изображения
Необходимо написать программу по заданию я нашел в интернете с помощью метода равномерного...


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

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

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