在Matlab中实现滤波器

3

我正在尝试对离散信号x实现以下滤波器:

enter image description here

我需要编写一个MATLAB函数,该函数接受长度为M(> N)的向量x和标量N作为输入。输出应为长度为M的向量y。
然后,我应该使用M = 50,x [n] = cos(n * pi / 5)+ dirac [n-30] - dirac [n-35]和N = 4、8、12测试过滤器。
以下是我的尝试,使用给定的输入和N将返回Inf:
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

我也尝试使用内置的filter函数,但是我无法让它正常工作。
使用过滤器的代码:
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)

提前感谢。

1个回答

5
那是因为dirac(0)会给你Inf。在你的信号中会发生两次,其中n=30n=35。我假设你想要单位冲击响应。因此,创建一个信号,在n=31n=36时输出为1,然后将其与余弦信号相加。这是因为MATLAB从1开始索引而不是0,所以dirac[0]意味着你的信号的第一个点是非零的,因此将其平移30个单位:dirac[n-30]将意味着第31个点是非零的。对于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

我正在考虑这个问题,但输入信号确实包含delta Dirac函数,这是一张图片:http://i.imgur.com/ZiLO7cG.jpg - Lightvvind
@Lightvvind 在DSP中,狄拉克脉冲是单位冲激。在连续时间中,狄拉克脉冲的定义是除了t=0以外的所有地方都为0,在这种情况下是无限的。 - rayryeng
@Lightvvind 没问题。顺便说一下,你的脚本有些问题。我进行了重写。现在应该可以工作了。 - rayryeng
谢谢,我会看一下你的代码。我在MATLAB方面还很不熟练。 - Lightvvind
@Lightvvind 没问题。如果您对代码有任何疑问,请随时询问。如果您想交谈,我也可以在我们的MATLAB聊天室里提供帮助:http://chat.stackoverflow.com/rooms/81987/matlab-and-octave - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接