Помощь в реализации разностного уравнения

Реализуйте приведенное ниже разностное уравнение Y[n]=04142y[n-1]+0,2929(x[n-1]) Предполагая , что частота дискретизации реализации составляет 8 кГц

любая помощь с кодом была бы замечательна :)

, 👍0

Обсуждение

Не могли бы вы, пожалуйста, поделиться тем, что вы пробовали, и это вообще вопрос для Arduino?, @Maaz Sk

Вы имеете в виду “0,4142”?, @Edgar Bonet

И какая помощь вам нужна? Мне совершенно непонятно, чего ты хочешь. И что вы имеете в виду под "частотой дискретизации 8 кГц"? Как это связано с уравнением? Что именно должно быть реализовано? И поскольку вы отметили его как "код-обзор": Пожалуйста, поделитесь кодом, который мы должны просмотреть., @chrisl

похоже, это школьная работа. пожалуйста, покажите свою попытку и объясните, где вы застряли. этот вопрос также, по-видимому, не связан с Arduino, поэтому здесь он не по теме, @jsotola


2 ответа


0

Предполагая, что у вас есть массив n-размера, вы можете сделать:

for(int i = 1;i<n;i++){
   y[i] = 04142*y[i-1] + 0.2929*x[i-1]
}  

Хотя вы не сказали, что такое x, или что такое y, или как вы должны использовать предыдущее значение, когда оно не было определено. Использование этого цикла должно работать, но предполагается, что массивы x и y уже существуют

,

почему ты выполняешь школьную работу ОП?, @jsotola


1

Я предполагаю, что вам нужен цифровой фильтр. Каждый раз, когда вы собираете образец x[n], вы передаете его фильтру, и фильтр возвращает соответствующий y[n], заданный

y[n] = 0.4142 y[n−1] + 0.2929 x[n−1]

Чтобы вычислить этот результат, фильтр должен запомнить предыдущее значение своего входа (x[n−1]) и своего выхода (y[n−1]). Для хранения этой информации вам понадобятся две переменные, которые я бы назвал x1 и y1. Обратите внимание, что фильтру не нужно запоминать ничего более старого , поэтому нет никакого смысла хранить больше данных. Нет необходимости создавать массивы для хранения целых последовательностей x и y. Поскольку значения необходимо запоминать между вызовами фильтра, они должны быть глобальными переменными. В качестве альтернативы они могут быть локальными для фильтра при условии, что у них есть статический квалификатор.

Как только у вас есть эти две переменные, вам просто нужно применить формулу для вычисления y[n]:

static float x1, y1;  // x[n-1], y[n-1]
float y = 0.4142 * y1 + 0.2929 * x1;

Есть еще одна вещь, о которой нужно позаботиться перед возвращением y: переменные x1 и y1 должны быть обновлены, чтобы сохранить текущие значения входных и выходных данных фильтра. Таким образом, при следующем вызове фильтра значения будут иметь прежние значения, как и ожидалось. Весь фильтр тогда

/*
 * Однополюсный фильтр нижних частот.
 * передаточная функция: H = 0,2929 / (z - 0,4142)
 * рекуррентное соотношение: y[n] = 0,4142 y[n-1] + 0,2929 x[n-1]
 */
float filter (float x) {
    static float x1, y1;  // x[n-1], y[n-1]
    float y = 0.4142 * y1 + 0.2929 * x1;
    x1 = x;
    y1 = y;
    return y;
}

Несколько заметок:

  1. x1 и y1 неявно инициализируются до нуля. Это обычная практика, но факт, о котором вы должны знать. Если это не соответствует вашим потребностям, добавьте явную инициализацию к определению переменных.

  2. Если вам нужно несколько экземпляров одного и того же фильтра, сохранение состояния как статических локальных объектов не будет работать. Вместо этого фильтр должен принять указатель на “объект состояния” в качестве дополнительного параметра. Если вы хотите сделать это “объектно-ориентированным” способом, указатель будет называться так.

  3. Зачем использовать x[n−1] вместо x[n]? Это просто добавляет искусственную задержку фильтра, не влияя на его производительность низких частот. При проектировании фильтров низких частот обычно предпочитают короткие задержки, при прочих равных условиях.

,