Matlab 數字信號處理編程導論 by Source Code


最近在做信號處理和模式識別的相關技術的研究,有感於介紹這方面的入門文章太少,希望記錄些有用的知識幫助需要從事相關工作的朋友少走些彎路。

Matlab大家應該都不陌生,園子里面應該有相當一部分人是學電信或自動控制出身的,我們從事着不同的行業,我們每天寫着不同的軟件。如果你在做信號處理或者通信相關的行業,相信如果有一天你需要做些原型設計,本文可以引導你快速的開始。

首先讓我們來看看matlab的產品定位:

The Language of Technical Computing

MATLAB® is a high-level language and interactive environment that enables

you to perform computationally intensive tasks faster than with traditional

programming languages such as C, C++, and Fortran.

 

過多的也沒必要解釋了,就是說一個字“快”,使用matlab可以使你想法更快的被實現出來,做設計的效率是其他編程語言說無法比擬的。據本人所知,數字信號處理里面的濾波器設計,頻譜分析,通信中的各種調制技術的設計,matlab可以說已經成了標准工具,就像windows上開發C#代碼,大部分人都使用visual studio一樣。

 

首先讓我們看看如何產生一些簡單有用的序列如何編寫:

---注:源代碼來自互聯網,僅供學習參考之用


單位沖擊:

function [x,n] = impseq(n0,n1,n2)
% Generates x(n) = delta(n-n0); n1 <= n,n0 <= n2
% ----------------------------------------------
% [x,n] = impseq(n0,n1,n2)
%
if ((n0 < n1) | (n0 > n2) | (n1 > n2))
    error( ' arguments must satisfy n1 <= n0 <= n2 ')
end
n = [n1:n2];
%x = [zeros( 1,(n0-n1)),  1, zeros( 1,(n2-n0))];
x = [(n-n0) ==  0];

 

單位階越: 

 


 

 function [x,n] = stepseq(n0,n1,n2)

% Generates x(n) = u(n-n0); n1 <= n,n0 <= n2
% ------------------------------------------
% [x,n] = stepseq(n0,n1,n2)
%
if ((n0 < n1) | (n0 > n2) | (n1 > n2))
error('arguments must satisfy n1 <= n0 <= n2')
end
n = [n1:n2];
%x = [zeros(1,(n0-n1)), ones(1,(n2-n0+1))];
x = [(n-n0) >= 0];

 

再看看如何實現一些簡單算法和計算:


序列相加:

 

function [y,n] = sigadd(x1,n1,x2,n2)
% implements y(n) = x1(n)+x2(n)
% -----------------------------
% [y,n] = sigadd(x1,n1,x2,n2)
%   y = sum sequence over n, which includes n1 and n2
%  x1 = first sequence over n1
%  x2 = second sequence over n2 (n2 can be different  from n1)
%
n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)
y1 = zeros( 1,length(n)); y2 = y1;              % initialization
y1(find((n>=min(n1))&(n<=max(n1))== 1))=x1;     % x1 with duration of y
y2(find((n>=min(n2))&(n<=max(n2))== 1))=x2;     % x2 with duration of y
y = y1+y2;                                     % sequence addition

 

序列相乘: 

 function [y,n] = sigmult(x1,n1,x2,n2)

% implements y(n) = x1(n)*x2(n)
% -----------------------------
% [y,n] = sigmult(x1,n1,x2,n2)
%   y = product sequence over n, which includes n1 and n2
%  x1 = first sequence over n1
%  x2 = second sequence over n2 (n2 can be different  from n1)
%
n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)
y1 = zeros( 1,length(n)); y2 = y1;              % 
y1(find((n>=min(n1))&(n<=max(n1))== 1))=x1;     % x1 with duration of y
y2(find((n>=min(n2))&(n<=max(n2))== 1))=x2;     % x2 with duration of y
y = y1 .* y2;                                  % sequence multiplication

 

LMS算法實現: 


 

 

function [h,y] = lms(x,d,delta,N)
% LMS Algorithm  for Coefficient Adjustment
% ----------------------------------------
% [h,y] = lms(x,d,delta,N)
%     h = estimated FIR filter
%     y = output array y(n)
%     x = input array x(n)
%     d = desired array d(n), length must be same  as x
% delta = step size
%     N = length of the FIR filter
%
M = length(x); y = zeros( 1,M);
h = zeros( 1,N);
for n = N:M
    x1 = x(n:- 1:n-N+ 1);
     y = h * x1 ' ;
     e = d(n) - y;
     h = h + delta*e*x1;
end

 

DFT算法實現: 


 

 function [Xk] = dft(xn,N)

% Computes Discrete Fourier Transform
% -----------------------------------
% [Xk] = dft(xn,N)
% Xk = DFT coeff. array over  0 <= k <= N- 1
% xn = N-point finite-duration sequence
%  N = Length of DFT
%
n = [ 0: 1:N- 1];                       % row vector  for n
k = [ 0: 1:N- 1];                       % row vecor  for k
WN = exp(-j* 2*pi/N);                 % Wn factor
nk = n ' *k;                           % creates a N by N matrix of nk values
WNnk = WN .^ nk;                     % DFT matrix
Xk = xn * WNnk;                      % row vector  for DFT coefficients

 

簡單序列計算:


 

1. x(n) =  2*delta(n+ 2) - delta(n- 4), - 5<=n<= 5  

2. x(n) = n[u(n)-u(n-10)]+10*exp(-0.3(n-10))(u(n-10)-u(n-20)); 0<=n<=20

3. x(n) = cos(0.04*pi*n) + 0.2*w(n); 0<=n<=50, w(n): Gaussian (0,1)
4. x(n) = {...,5,4,3,2,1,5,4,3,2,1,...}; -10<=n<=9 

 

結果如下:

 

幾個簡單的語句就可以完成相當復雜的計算,如果用C語言寫這中算法,相信設計效率的差距是不言而喻的,工欲善其事必先利其器,選對工具對於做正確的事情是很重要的。

 

關於學習資料和文檔:

推薦matlab的官方手冊和help文檔,對於每個工具箱的描述和基本功能的介紹都非常的明確,當然資料都是英文的,中文手冊我也一直沒有找到,如果有朋友有中文的手冊,請通知我。

關於書籍,我在書店隨便翻看了幾本,大部分都是手冊翻譯,而且都是就某個工具箱的翻譯,不是很全,書名倒是都很霸氣,如果那個朋友發現好的書籍也請您通知我,我會更新博文,讓更多的人受益。

 

總結:

本文資料源自本人的讀書筆記和互聯網,通過一些簡單的算法和源代碼說明了如何用matlab解決相關的問題,當然本文面向的是初學者,如果哪位對高級的topic感興趣,可以聯系我,希望對大家有所幫助。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM