首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab IIR滤波器的实现

Matlab IIR滤波器的实现
EN

Code Review用户
提问于 2018-02-23 13:56:07
回答 1查看 817关注 0票数 6

我需要在Java中实现Matlab的filter(b,a,x)函数。在我这样做之前,我想在转换成Java之前用Matlab重写这个函数。到目前为止,所有的系数都写得很好。见下文:

代码语言:javascript
复制
x = load('data.csv');
windowSize = 10; 
b = (1/windowSize)*ones(1,windowSize); % b coefficient - a is unused 
i = 1;
for n = length(b) : length(x) % yes I know I am losing my first 10 samples
    y(i,:) = [ b(1)*x(n) + b(2)*x(n-1) + b(3)*x(n-2) + b(4)*x(n-3) + ... 
        b(5)*x(n-4) + b(6)*x(n-5) + b(7)*x(n-6) + b(8)*x(n-7) + ...
        b(9)*x(n-8) + b(10)*x(n-9) ];
    i = i+1; % used for indexing calculated results into new array
end

但是,当更改窗口大小时,我希望循环内容自动更新。在上面的例子中,如果我要将窗口大小增加2倍,那么我必须在for循环中写出两倍的b和x倍数。这对我的问题是个糟糕的解决方案。请给我建议。

EN

回答 1

Code Review用户

发布于 2018-02-24 16:46:50

所以这个解决方案起作用了:

代码语言:javascript
复制
x = load('data.csv');
windowSize = 10; 
b = (1/windowSize)*ones(1,windowSize);
i = 1;

for n = windowSize: length(x)
    m = 0;
    tempSum = 0;
        for j = 1 : windowSize
            temp = b(j)*x(n-m);
            tempSum = tempSum + temp;
            m = m + 1;
        end
    y(i,:) = [tempSum]
    i = i+1;
end

见下文的结果:

与其在一开始有非常不准确的结果,我只是略过这些。重要的是要注意,在这个解中,你丢失的样本数量等于b系数的数量。所以一定要重新确定X轴。

用Matlabs = setdiff(y,yy)函数对结果进行了比较,发现所提解与Matlabs (b,a,x)函数没有差别。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/188192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档