我试图在离散信号上实现以下滤波器:
matlab - 在Matlab中实现过滤器-LMLPHP
我应该写一个MATLAB函数,它以长度m(>N)向量x和标量N作为输入输出应该是长度M向量x
然后我应该用M=50,y和N=4,8,12测试过滤器。
这是我的try,它返回带有给定输入的Inf和x[n]=cos(n*pi/5)+dirac[n-30]-dirac[n-35]

function y = filt( x, N )
% filter function
    if(~isvector(x))
        error('Input must be a vector')
    end
    y = zeros(1,length(x));
    temp = zeros(1,length(x));
    n=1;
    for v = x(:)
        temp(n) = v(n);
        if(n <= N-1)
            y(n) = max(x);
            n = n+1;
        elseif(n >= N-1)
            y(n) = max(temp);
        end
    end
end

我也试过使用内置的N函数,但是我无法让它工作。
使用筛选器的代码:
p = zeros(1,50);
for i=0:50
    p(i+1)= cos(i*pi/5)+dirac(i-30)-dirac(i-35)
end
y = filt(p,4)

提前谢谢。

最佳答案

那是因为dirac(0)给你Inf这将在信号中的两个位置发生,其中n=30n=35我想你想要的是单位冲量因此,在n = 31n = 36处创建一个输出为1的信号,然后将其与余弦信号相加这是因为Matlab在1开始索引而不是0,所以dirac[0]将意味着你的信号的第一个点是非零,所以将这个转换为30:dirac[n-30]将意味着第三十一点是非零。与dirac[n-35]的情况类似,因此第36点为非零:

p = zeros(1,50);
p(31) = 1; p(36) = 1;
p = p + cos((0:49)*pi/5);
y = filt(p,4);

我对你的代码也有一些保留它不像你想象的那样具体来说,我在看这个部分:
n=1;
for v = x(:)
    temp(n) = v(n);
    if(n <= N-1)
        y(n) = max(x);
        n = n+1;
    elseif(n >= N-1)
        y(n) = max(temp);
    end
end

执行v = x(:)操作将生成列向量,使用带有列向量的循环将产生无意的结果具体地说,这个循环只执行一次,v是整个信号您也没有为每个窗口正确检查条件您正在执行max(x),它将最大值应用到整个信号,而不是窗口。
如果我可以建议重写,您应该这样做:
function y = filt( x, N )
% filter function
    if(~isvector(x))
        error('Input must be a vector')
    end
    y = zeros(1,length(x));

    %///// CHANGE
    for n = 1 : numel(x)
        if (n <= N)
            y(n) = max(x(1:n));
        else
            y(n) = max(x(n:-1:n-N+1));
        end
    end
end

注意if语句是n <= N这是因为在Matlab中,我们在1开始索引,但是等式中的符号在0开始索引。因此,它现在必须是n <= N-1,而不是检查n <= N

10-08 08:44