我读到Matlab过滤器命令用于求解差分方程。 filter()是在内部使用z-Transform还是仅使用递归,即以起始值x(0),y(0)开始,仅在时间上向前运行差分方程? 抱歉,如果这个问题没有意义,我是这个领域的新手。

谢谢,

===============>>#1 票数:3 已采纳

滤波器的实现可能是频域技术的一种巧妙用法,但是根据MATLAB文档,它数学上等效于求解差分方程:

Y = FILTER(B,A,X) filters the data in vector X with the
    filter described by vectors A and B to create the filtered
    data Y.  The filter is a "Direct Form II Transposed"
    implementation of the standard difference equation:

    a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                          - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

初始条件被选择为全零,因为我们假设在开始滤波之前只是没有信号(全零)。 如果要指定这些初始条件,则filter命令允许您指定初始( Zi )和最终( Zf )条件的向量: [Y,Zf] = FILTER(B,A,X,Zi)

===============>>#2 票数:2

MatLab filter()函数实现了irir过滤器(递归过滤器),即,它解决了差分方程。 在频域中的实现将具有更高的成本。 时域为O(N),如果使用FFT,则频域理想为log(N),而O(N²)。

===============>>#3 票数:1

如果有人需要的话,这是前一段时间我用C ++实现MATLAB内置filter功能的方式。 Zi您可以通过初始条件,并在需要时收集最终条件。

#include <vector>
#include <exception>
#include <algorithm>

typedef vector<double> vectord;

void filter(vectord B, vectord A, const vectord &X, vectord &Y, vectord &Zi)
{
    if (A.empty())
        throw std::domain_error("The feedback filter coefficients are empty.");
    if (std::all_of(A.begin(), A.end(), [](double coef){ return coef == 0; }))
        throw std::domain_error("At least one of the feedback filter coefficients has to be non-zero.");
    if (A[0] == 0)
        throw std::domain_error("First feedback coefficient has to be non-zero.");

    // Normalize feedback coefficients if a[0] != 1;
    auto a0 = A[0];
    if (a0 != 1.0)
    {       
        std::transform(A.begin(), A.end(), A.begin(), [a0](double v) { return v / a0; });
        std::transform(B.begin(), B.end(), B.begin(), [a0](double v) { return v / a0; });
    }

    size_t input_size = X.size();
    size_t filter_order = std::max(A.size(), B.size());
    B.resize(filter_order, 0);
    A.resize(filter_order, 0);  
    Zi.resize(filter_order, 0);
    Y.resize(input_size);

    for (size_t i = 0; i < input_size; ++i)
    {
        size_t order = filter_order - 1;
        while (order)
        {
            if (i >= order)
                Zi[order - 1] = B[order] * X[i - order] - A[order] * Y[i - order] + Zi[order];
            --order;
        }
        Y[i] = B[0] * X[i] + Zi[0];
    }
    Zi.resize(filter_order - 1);
}

随时使用以下代码对其进行测试:

TEST_METHOD(TestFilter)
{
    vectord b_coeff = { /* Initialise your feedforward coefficients here */ };
    vectord a_coeff = { /* Initialise your feedback coefficients here */ };

    vectord input_signal = { /* Some input data to be filtered */ };
    vectord y_filter_ori = { /* MATLAB output from calling y_filter_ori = filter(b_coeff, a_coeff, input_signal); */ };

    vectord y_filter_out; vectord zi = { 0 };  // Set empty initial conditions
    filter(b_coeff, a_coeff, input_signal, y_filter_out, zi);
    Assert::IsTrue(compare(y_filter_out, y_filter_ori, 0.0001));
}

bool compare(const vectord &original, const vectord &expected, double tolerance = DBL_EPSILON)
{
    if (original.size() != expected.size())
        return false;
    size_t size = original.size();

    for (size_t i = 0; i < size; ++i)
    {
        auto diff = abs(original[i] - expected[i]);
        if (diff >= tolerance)
            return false;
    }
    return true;
}

  ask by BBDynSys translate from so

未解决问题?本站智能推荐:

1回复

在Matlab中实现过滤器

我试图在离散信号x上实现以下过滤器: 我应该编写一个MATLAB函数,它将长度为M(> N)的向量x和一个标量N作为输入。 输出应该是长度为M的向量y 。 然后,我应该测试M = 50, x[n]=cos(n*pi/5)+dirac[n-30]-dirac[n-35]和
1回复

MATLAB中的视频过滤器

我正在尝试使用MATLAB复制本文的结果。 我需要对视频的RGB通道序列应用过滤器(每个通道每帧有1个颜色值,对应于该帧中该通道所有像素的值之和,即如果有200帧, 200x3矩阵,列为RGB,行为帧)。 我应该过滤得到的3个信号并应用PCA和ICA。 我是信号处理的新手,我一直在
1回复

加速MATLAB过滤器命令

我相对较不熟悉使用MATLAB过滤器。 我正在尝试使用以下命令过滤相当大的数据集(大约200万个数据点) 当我运行MATLAB Profiler时,该行显示 耗时超过500秒。 关于如何加快速度的任何想法? 我尝试使用在线找到的FilterM函数( http://www.m
2回复

MATLAB的过滤器:如何设置初始条件

我有一个非常简单的问题:生成y_1,...,y_n使得 y_t = x_t + a * y_ {t-1} + b * y_ {t-2} 其中给出了a,b,x_1,...,x_n,以及y_0和y _ {-1}。 我可以通过2种方式(使用循环并在使用filter之前进行一些手动调整)使
2回复

移动窗口集成过滤器Matlab

我需要在Matlab中将移动窗口积分滤波器应用于信号,我发现下面的代码显然可以做到这一点,但是我不明白它是如何工作的,有人可以解释吗?
2回复

什么是MATLAB函数过滤器中'zf'的内容

我知道为了在chuncks中过滤大量数据,可以使用具有适当滤波器系数的函数'filter',并将最终条件'zf'作为其初始条件'zi'传递给下一个chunk。 我很迷惑。 'zf'的内容究竟是什么? 它是否包含最后的相关输入样本? (在纯FIR滤波器中)最后的相关输出样本? (
2回复

R等同于MATLAB的过滤器函数

我正在使MATLAB代码适应R,并尝试使用ARMA公式生成波形。 MATLAB的filter是否有一个简单的R等效函数来获取AR / MA系数以构建波形?
1回复

比较过滤后的数据:matlab带通函数与过滤器函数

我正在尝试分解带通函数如何进行过滤并将其卡在该行上(在创建过滤器之后)。 x是数据,opts具有过滤器结构。 我一直在环顾四周,却找不到关于signal.internal.filteringfcns.filterData函数的任何信息。 我将输出与filter(opts.Filter
2回复

C99相当于MATLAB的“过滤器”吗?

为什么MATLAB和C版本会产生不同的结果? MATLAB: C: 哪里 **输出为:** 前几个值相同(或相似),但随后却有所不同。 同样,第一次迭代后,滤波器状态完全不同。 我究竟做错了什么?
3回复

更改MATLAB中的过滤器(B,A,X)和备注错误

这篇文章与我以前的问题有关:因为我在上面上传了我的算法,所以在matlab中进行图像处理 。 认为我正在尝试更改代码的过滤部分。 在matlab filter.m函数可以使filter(B,A,我的像素在时间上进化)并返回过滤后的值。 但此刻我必须一起传递整个时间序列。 但是问题是,