Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2016, 17:34   #1
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию Ряд Котельникова

В общем, написал функцию по ряду Котельникова:
Код:
// Ряд Котельникова
// dt - шаг
// Y - y(t), T - Время
// M - количество отсчётов
// Возвращает - Y(t)
double HarmonicKotelnik(double &dt, double Y, double T, int M)
{
  double pi, s = 0;
  for(int k = 0; k < M; k++)
  {
    pi = M_PI * (T/dt - k);
    s += Y * k * dt * (sin(pi) / pi);
  }
  dt += dt;
  return s;
}
Здесь, программа обращения к функции (FPrint, подпрограмма вывода на консоль).
Код:
  double y = 1, dt = 0.1;
  for(int i = 0; i < 3; i++)
  {
    y = HarmonicKotelnik(dt, y, 10, 5);
    FPrint(y, false);
  }
Сомнения в том, правильно ли я вычисляю y(k dt)? Ниже формула, по которой ведутся вычисления.
Изображения
Тип файла: jpg Ряд Котельникова.jpg (61.3 Кб, 146 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 04.04.2016 в 17:58.
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.04.2016, 18:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

y(k dt) насколько понял это тот же ряд для t= k*dt, а не Y * k * dt
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.04.2016, 18:14   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы спутала надо не Y * k * dt, а Y(k * dt), т.е. отсчеты
p51x вне форума Ответить с цитированием
Старый 04.04.2016, 18:35   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Так вот я и не врублюсь. То ли то, что в скобках просто на Y умножить т.к. выходное значение функции, оно-же входное на следующей итерации. То-ли k * dt по новой вычисляется?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.04.2016, 18:52   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Это отсчеты, если бы это был не дискретный случай, то там стоял бы интеграл и вычислялся бы он... Представьте: у вас отрезок разбит на m+1 частей, dt - шаг, вот и идет суммирование по этим точкам Y(0) Y(dt) Y(2dt) Y(3dt) ...
p51x вне форума Ответить с цитированием
Старый 04.04.2016, 19:03   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Это отсчеты, если бы это был не дискретный случай, то там стоял бы интеграл и вычислялся бы он... Представьте: у вас отрезок разбит на m+1 частей, dt - шаг, вот и идет суммирование по этим точкам Y(0) Y(dt) Y(2dt) Y(3dt) ...
С отсчётами всё понятно. Они в цикле вычисляются от 0 до M. Чё с этими отсчётами в коде делать? Просто с дельтами никогда не сталкивался. Что в формуле обозначает Y(...)? Дискретную математику изучал лет 35 назад. Почти всё из головы выветрилось.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 04.04.2016 в 19:12.
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.04.2016, 19:34   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Y(t) - функция, Y(0) Y(dt) Y(2dt) Y(3dt) ... ее значение в определенных точках
p51x вне форума Ответить с цитированием
Старый 04.04.2016, 19:38   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Они в цикле вычисляются от 0 до M.
Отчёты не вычисляются. Они измеряются микрофона и передаются в виде массива в функцию.
Цитата:
Просто с дельтами никогда не сталкивался.
dt -это константа она в формуле не изменяется.
Слева у вас в формуле стоит аналоговый, т.е непрерывный сигнал.
А справа дискретный, т.е. значения в узлах сетки.

Код:
// fd - частота дискретизации в Гц.
function InterpolationKotelikov(const t:Real; const fd:Real; y:TArrayReal):Real; Overload;
var
 dt:Real;
begin
dt:=1/df;
for k:=0 to m do
  Result:=Result+y[k]*Sinc(Pi*(t/dt-k));  //Используем sinc, так как автор формулы не позаботился о делении на 0
end;

// Sin(x)/x
function  Sinc(x:Extended):Extended;
begin
If x<>0 then Result:=Sin(x)/(x) else Result:=1;
end;
Почему y[k], а не y[k*dt]? Не вижу надобности. Но если вы хотите, то можете добавить. Но тогда надо брать только кратные 2^n или заменить y[k], на виртуальную функцию.

Код:
type
 TFunc = function (t:Real):Real;

function InterpolationKotelikov(const t:Real; const fd:Real; y:TFunc):Real; Overload;
var
 dt:Real;
begin
// fd - частота дискретизации в Гц.
dt:=1/df;
for k:=0 to m do
  Result:=Result+y(k*dt)*Sinc(Pi*(t/dt-k));
end;

Учебник для справки: А.Б.Сергиенко_Цифровая обработка сигналов
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 04.04.2016 в 20:34.
Pavia вне форума Ответить с цитированием
Старый 04.04.2016, 20:21   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Отчёты не вычисляются. Они измеряются микрофона и передаются в виде массива в функцию.

dt -это константа она в формуле не изменяется.
Слева у вас в формуле стоит аналоговый, т.е непрерывный сигнал.
А справа дискретный, т.е. значения в узлах сетки.

Код:
// fd - частота дискретизации в Гц.
Почему y[k], а не y[k*dt]? Не вижу надобности. Но если вы хотите, то можете добавить. Но тогда надо брать только кратные 2^n или заменить y[k], на виртуальную функцию.

Код:
// fd - частота дискретизации в Гц.
dt:=1/df;

Учебник для справки: А.Б.Сергиенко_Цифровая обработка сигналов
Pavia, спасибо. Теперь понятно. Задаём частоту дескритизации. 1/f получаем период в секундах. Это и есть dt, которая неизменна, пока частота дескритизации не изменилась. Дальше всё понятно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 05.04.2016, 12:27   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Вот доработанная функция:
Код:
// F - частота дескритизации
// M - количество отсчётов
// T - Время отсчёта
// Возвращает - Y(t)
double HarmonicKotelnik(double *Y, double T, double F, int M)
{
  double pi, dt = 1 /F, s = 0, sp;

  for(int k = 0; k < M; k++)
  {
    pi = M_PI * (T/dt - k);
    if(pi != 0)
      s += Y[k] * (sin(pi) / pi);
  }
  return s;
}

Вызов функции:
y = HarmonicKotelnik(Y, N, 1000, N);
Вот ряд, который записывается в массив Y - 0 2 4 6 8 6 4 2 0 -2 -4 -6 -8.
Частота дискретизации - 1000 Гц
Количество отсчётов и время совпадают с длинной массива Y.

Почему функция выдаёт такой результат - 5.182505423e-16 как его интерпретировать? Как спектральную плотность? Но почему -16-я степень?
Изображения
Тип файла: jpg signal.JPG (7.8 Кб, 29 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 05.04.2016 в 12:37.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задана функция логарифмического синуса и ее разложение в ряд. Разработайте алгоритм вычисления разложения в ряд с погрешностью ξ пышь-пышь Помощь студентам 4 17.05.2013 07:49
Ряд Тейлора в С++ D.vers Помощь студентам 1 02.01.2012 13:45
вычислить функцию с по-щью разложения в ряд.(Ряд Тейлора) feelstor Помощь студентам 2 26.12.2011 03:44
по 4 в ряд mrgrudge PHP 12 11.03.2010 18:24
Ряд в С Luntik93 Помощь студентам 1 03.05.2009 13:29