【问题标题】:Implementing a filter in Matlab在 Matlab 中实现过滤器
【发布时间】:2016-02-06 19:11:46
【问题描述】:

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

我应该编写一个 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 来测试过滤器。

这是我的尝试,它返回带有给定输入的 InfN:

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)

提前致谢。

【问题讨论】:

    标签: matlab filtering signal-processing


    【解决方案1】:

    那是因为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(:) 会产生一个column 向量,并且使用带有列向量的循环会产生无意的结果。具体来说,这个循环只会执行一次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 &lt;= N。这是因为在 MATLAB 中,我们从 1 开始索引,但您等式中的符号从 0 开始。因此,现在必须是 n &lt;= N,而不是检查 n &lt;= N-1

    【讨论】:

    • 我在想这个,但输入信号确实包含狄拉克,这是一张图片:i.imgur.com/ZiLO7cG.jpg
    • @Lightvvind 在 DSP 中,狄拉克是单位脉冲。在连续时间中,除t=0(在本例中为无限)之外,狄拉克的定义处处为 0。
    • @Lightvvind 没问题。顺便说一句,您的脚本存在一些问题。我做了一个重写。它现在应该可以工作了。
    • 谢谢,我去看看你的代码。我对 MATLAB 还是很陌生。
    • @Lightvvind 没问题。请询问有关使您感到困惑的代码的任何信息。如果您愿意,我也可以在我们的 MATLAB 聊天室中进行交流:chat.stackoverflow.com/rooms/81987/matlab-and-octave
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多