2015-11-05 85 views
3
濾波器

我試圖實現以下濾波器上的離散信號x實現在Matlab

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

這是我的嘗試,它返回Inf文件與給定的輸入和N

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) 

在此先感謝。

回答

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

+0

我在想,但輸入信號確實包含dirac,下面是一個圖像:http://i.imgur.com/ZiLO7cG.jpg – Lightvvind

+0

@Lightvvind在DSP中,dirac是單位衝動。在連續時間中,除了't = 0'外,迪拉克的定義是無處不在的,在這種情況下是無限的。 – rayryeng

+0

@rayreng我看到了,我對此毫不知情,謝謝 – Lightvvind