數字信號處理
信號:信號是信息的載體,以某種函數的形式傳遞信息。這個函數可以是時間域、頻率域或其它域,但最基礎的域是時域。
信號的分類:
週期信號 / 非週期信號
確定信號 / 隨機信號
能量信號 / 功率信號
連續時間信號 / 離散時間信號 / 數字信號
1-D 信號:單個獨立變量的一維函數, e.g. 語音信號。
2-D 信號:兩個獨立變量的二維函數, e.g. 圖像信號。
M-D 信號:多個獨立變量的多維函數, e.g. 彩色視頻信號(RGB) 。
數字信號處理是用數值計算的方法,完成對信號的處理。因此處理的實質是“運算”,運算的基本單元是延時器、乘法器和加法器。
模擬信號數字化處理的系統框架:
前置濾波器:將輸入信號xa(t)中高於某一頻率(稱摺疊頻率,等於抽樣頻率的一半)的分量加以濾除。
A/D變換器:在A/D變換器中每隔T秒(抽樣週期)取出一次xa(t)的幅度,抽樣後的信號稱爲離散信號。
數字信號處理器:按照預定要求,在處理器中將信號序列x(n)進行加工處理得到輸出信號y(n)。
D/A變換器:由一個二進制碼流產生一個階梯波形,是形成模擬信號的第一步。
模擬濾波器:把階梯波形平滑成預期的模擬信號;以濾除掉不需要的高頻分量,生成所需的模擬信號ya(t)。
以傅里葉變換爲基礎的“經典”處理方法,主要包括:
(1)離散傅里葉變換及其快速算法。
(2)濾波理論(線性時不變離散時間系統,用於分離相加性組合的信號,要求信號頻譜佔據不同的頻段)。
MATLAB基礎及在DSP中的應用
MATLAB即Matrix Laboratory 矩陣實驗室的意思,matlab語言是由美國的Clever Moler博士於1980年開發的。
MATLAB是一種直譯式的高級語言,比其它程序設計語言容易。
MATLAB語言不受計算機硬件的影響,286以上的計算機都可以使用。
MATLAB提供了豐富的矩陣運算處理功能,是基於矩陣運算的處理工具。
變量----矩陣,運算----矩陣的運算
一些簡單的例子:
用簡短命令計算並繪製在 0=<x<=6 範圍內的sin(2x)、sinx2、sin2x。
x=linspace(0,6)
y1=sin(2*x),y2=sin(x.^2),y3=(sin(x)).^2; 符號x和^之間要加上一個. <-----
plot(x,y1,x, y2,x, y3)
求1到100的和:
s = 0;
for n = 1:100 % for n=1:1:100 also is ok
s = s + n;
end
Matlab的變量命名規則:
(1)以字母開頭,後面可跟字母、數字和下短線;
(2)大小寫字母有區別;
(3)不超過31個字符。
M文件:就是用Mat lab語言編寫的,可在Matlab裏運行的程序。M文件有兩大類:命令文件和函數文件。
M命令文件(腳本文件):只是一些命令行的組合。而且其中的所有變量也成爲工作區的一部分。
M函數文件:格式:function 輸出變量=函數名(輸入變量)。
函數文件注意的幾個地方:
(a)輸出變量多於一個時,要用方括號;
(b)輸入、輸出變量多於一個時,要用逗號隔開;
(c)必須以函數名存盤。
Matlab繪製曲線:
fplot:用於繪製一元函數曲線。
fplot (‘fun’ ,[a , b])示繪製區間[a ,b]上函數 y=fun 的圖形。
Matlab求導數:
diff(f,x):f(x)對x求導
diff(f,x,n):f(x)對x求n階導
一個求導的例子:
syms x
y = 3*x^3 - exp(x)/2 + 1
dy = diff(y,x,1)
pretty(dy)
Matlab求駐點:
求 y=f(x) 駐點命令格式爲:x= solve(‘f(x)’)
Matlab求特徵值和特徵向量:
(1)E=eig(A) 求矩陣A的全部特徵值,構成向量E。
(2)[V,D]=eig(A) 求矩陣A的全部特徵值,構成對角陣D,並求A的特徵向量構成V的列向量。
(3)[V,D]=eig(A,'nobalance') 與第2種格式類似,但第2種格式中先對A作相似變換後求矩陣A的特徵值和特徵向量,而格式3直接求矩陣A的特徵值和特徵向量。
例 : 用3種不同的格式求A的特徵值和特徵向量。
命令如下:
A=[1,2,2;1,-1,1;4,-12,1];
E=eig(A)
[V,D]=eig(A)
[V,D]=eig(A,'nobalance')
Matlab產生信號波形:
三種方法:
1.使用funtool 圖形化函數計算器
可以自定義自變量x變化範圍,缺省爲
[-2pi,2pi], a爲自由參數.
1.5sin(x)、5exp(-x)、sin(x)/x、sqrt(a*x)
2.用信號處理工具箱(Signal Processing toolbox)
3.向量表示法
t= -10:0.5:10 ;
f=sin(t)./t ;
plot(t,f);
title(‘f(t)=Sa(t)’);
xlabel(‘t’); axis([-10,10,-0.4,1.1]);
用以下程序可產生正弦波:
t=0:0.001:50; y=sin(2*pi*50*t); plot(t(1:50),y(1:50));
用以下程序可產生加入隨機噪聲的正弦波:
t=0:0.001:50; y=sin(2*pi*50*t); s=y+randn(size(t)); plot(t(1:50),s(1:50));
用以下程序可產生週期方波:
t=0:0.001:2.5; y=square(2*pi*30*t); plot(t(1:50),y(1:50));
用以下程序可產生週期鋸齒波:
t=0:0.001:2.5; y=sawtooth(2*pi*30*t); plot(t,y);
數字信號圖像處理
圖像:是對客觀對象的一種相似性的描述或寫真,它包含了被描述或寫真對象的信息,是人們最主要的信息源。
圖(picture):是物體反射或透射光的分佈,它是客觀存在的
像(Image):是人的視覺系統所接收的圖在人的大腦中所形成的印象和認識
模擬圖像:也稱光學圖像,是指空間座標和明暗程度連續變化的,計算機無法直接處理的圖像,它屬於可見圖像。
數字圖像:是指能被計算機存儲、處理和使用的圖像,是空間座標和灰度均不連續,用離散數字表示的圖像。
圖像數字化:
(1) 採樣(空間離散):空間上連續的圖像變化成離散點的操作成爲採樣,實際上是空間座標(x,y)的數字化,即按一定的間隔(△x, △ y)將圖像劃分M行×N列的網格。採樣網格的大小關係到圖像的質量及所包含的信息。(圖像的大小)
(2)量化(灰度離散):灰度等級越高,圖片質量越好。(包含色彩數目)
圖像的類型:
1.按灰度值可以分爲二值圖像和多值圖像。
二值圖像:每個像素灰度由0或1構成
多值圖像:每個象素灰度由0~2n之間的數表示(n>1)
2. 按波段量可分爲單波段、彩色或多波段數字圖像。
Matlab圖像的讀取與顯式:
A = imread(filename,fmt)
[X,map] = imread(filename,fmt) x:像素顏色值 map:色譜
load filename:都系統自帶的圖片
imshow football.jpg
imshow(X,map)
imshow(uint8(X))
imview('trees.tif')
figure :創建一個新的窗口
彩色圖像的顯式:(調整RGB的顯式順序)
tu=imread('football.jpg');
imshow(tu)
imshow(tu(:,:,[1 2 3]))
imshow(tu(:,:,[3 2 1]))
imshow(tu(:,:,[1 3 2]))
灰度圖像的顯式:
I=imread('pout.tif');
figure,imshow(I)
figure,imshow(I,[1 200])
figure,imshow(I,2)
figure,imshow(I,8)
figure,imshow(I,256)
調整圖像大小:使用truesize
figure,imshow(bw),truesize([100 100])
figure,imshow(bw,'notruesize')
圖像顯示中邏輯操作符的使用(常用於二值圖像)
bw=imread('circbw.tif');
imshow(bw)
figure,imshow(~bw) 每個像素值取反,黑白顛倒
顯式多幀圖像(實現動畫):
語法
mov = immovie(X,map)
mov = immovie(RGB)
通常和movie(mov)聯合使用
一個例子:
axis equal
M=moviein(16)
set(gca,'NextPlot','replacechildren')
for j=1:100
plot(fft(eye(j+16)))
M(:,j)=getframe;
end
Movie(M,2)%指定放映幾次
圖像的幾何運算:
1.圖像大小的調整:imresize
語法
B = imresize(A,m) n:放大的倍數
B = imresize(A,m,method)
B = imresize(A,[mrows ncols],method)
B = imresize(...,method,n)
B = imresize(...,method,h)
imresize()
X3 = imresize(X,4); 放大4倍
figure
imshow(X3,[]);
2.圖像旋轉:imrotate
語法
B = imrotate(A,angle)
B = imrotate(A,angle,method)
A>0逆時針選擇一個角度angle,反之順時針
subplot(222);將窗口分爲2行2列4塊,選擇第2塊。
3.圖像裁剪:imcrop
基本語法
J= imcrop
J = imcrop(I)
J = imcrop(X,map)
4.圖像亮度的調整:
線性處理:
tu1=(double(tu))*1.5+30; 對tu進行運算處理,從而調整亮度
figure,imshow(uint8(tu1))
用imadjust來進行調整:
tu= imadjust(i,[low_in; high_in],[low_out; high_out])
LI=imadjust(tu,[0.3 0.7],[0,1]);
figure,imshow(LI)
5.直方圖均衡化處理:histeq
hm=histeq(m);將原圖m均衡化處理。
hist(double(hm)); 顯式均衡化處理後的直方圖。
6.圖像中斑點的去除:
I=imread('eight.tif');
J=imnoise(I,'salt & pepper',0.06);
subplot(221),imshow(I),title('原圖')
subplot(222),imshow(J),title('含斑點的圖')
H = fspecial('average');
am = imfilter(J,H);
subplot(223),imshow(am),title('均值')
zm=medfilt2(J);%中值
subplot(224),imshow(zm),title('中值')
7.圖像的輪廓:語法 imcontour(I,N)
I = imread('cameraman.tif');
imcontour(I,1)
8.圖像的邊界檢測:
語法:edge(I)
I=imread('coins.png');
BW1 = edge(I,'roberts');
BW2 = edge(I,'sobel');
BW3 = edge(I,'log');
figure
subplot(221),imshow(I),title('原圖')
subplot(222),imshow(BW1),title('roberts算子')
subplot(223),imshow(BW2),title('sobel算子')
subplot(224),imshow(BW3),title('laplacian算子')
9.圖像間的運算:
兩個圖像合併:
I=imread(‘rice.tif');
J=imread('cameraman.tif');
k=imadd(I,J);
10.特定區域的增強處理:
I = imread('pout.tif');
imshow(I)
BW = roipoly(I);
H = fspecial('unsharp');
J = roifilt2(H,I,BW);
figure, imshow(J)
11.特定區域的填充:
load trees
I=ind2gray(X,map);
figure,imshow(I)
J=roifill;
figure,imshow(J)
55系列的DSP基礎
DSP: 數字信號處理,用數學方法處理數字化了的信號。
經典數字處理方法:
時域:信號濾波FIR、IIR
頻域:頻譜分析FFT
數字信號處理特點:
ΣAi×Xi
高速實時
DSP特點:多總線,流水線執行
德州儀器(TI)的三大DSP系列:
TMS320C2000™:控制優化
TMS320C5000™:低功耗
TMS320C6000™:高性能
DAVINCI技術是TI推出的新一代視頻、圖像、語音和音頻解決方案的統稱。
C55x根據功能的不同將CPU分爲4個單元:
指令緩衝單元(I):由指令緩衝隊列IBQ(Instruction Buffer Queue)和指令譯碼器組成。
程序流程單元(P):由程序地址產生電路和寄存器組構成。
地址流程單元(A):由數據地址產生電路、算術邏輯電路和寄存器組構成。
數據計算單元(D):由移位器、算術邏輯電路、乘法累加器和寄存器組構成。D單元包含了CPU的主要運算部件。
讀程序地址總線(PAB)上傳送24位的程序代碼地址,由讀程序數據總線(PB)將32位的程序代碼送入指令緩衝單元I進行譯碼。
指令流水線:
C55x CPU採用指令流水線工作方式,C55x的指令流水線包括兩個階段:
第一階段是取流水線,即從內存中取出32位的指令包,放入指令緩衝隊(IBQ)中,然後爲流水線的第二階段提供48位的指令包。
流水線的第一階段(取流水線):
其中PF1表示向存儲器提供的程序地址,PF2表示等待存儲器的響應,F表示從存儲器取一個指令包並放入指令緩衝隊列中,PD表示對指令緩衝隊列中的指令預解碼(確定指令的起始和結束位置;確定並行指令)。
第二階段是指執行流水線,這部分的功能是對指令進行解碼,完成數據的存取和計算。
CCS與DSP開發基礎
CCS的兩種工作模式:
1.軟件仿真器模式:可以脫離DSP芯片,在PC機上模擬DSP的指令集和工作機制,主要用於前期算法實現和調試。
2.硬件在線編程模式:可以實時運行在DSP芯片上,與硬件開發板相結合在線編程和調試應用程序。
使用CCS軟件要用到的文件類型介紹:
*.cmd:鏈接命令文件。
*.obj —— 由源文件編譯或彙編後所生成的目標文件;
*.out —— 完成編譯、彙編、鏈接後所形成的可執行文件,可在CCS監控下調試和執行;
*.wks — 工作空間文件,可用來記錄工作環境的設置信息;
*.cdb — CCS的配置數據庫文件,是使用DSP/BIOS API模塊所必須的。當保存配置文件時,將產生鏈接器命令文件(*cfg.cmd)、頭文件(*cfg.h54)和彙編語言源文件(*cfg.s54)。
CCS窗口中的兩個目錄文件夾:
1、“GEL files”文件夾,用來修改和保存用戶所設置的開發環境,包括窗口和工具條的位置以及自動打開窗口的設置等。
2、“Project”文件夾包含了工程項目中所有的文件庫和文件。在一個工程項目中,文件被分成幾個不同的庫進行管理。
裝載文件:選擇“File”菜單中的“Load Program(裝載程序)”命令,彈出“Load Program(裝載程序)”對話框。
實時運行:CCS提供了4中實時運行操作:執行程序、暫停執行、動畫執行、自由執行。
實時數據交換:
RTDX由目標系統和主機兩部分組成,小的RTDX庫函數在目標系統DSP上運行。開發者通過調用RTDX軟件庫的API函數將數據輸入或輸出目標系統的DSP,庫函數通過在片仿真硬件和增強型JTAG接口將數據輸入或輸出主機平臺,數據在DSP應用程序運行時實時傳送給主機。
在主機平臺上,RTDX庫函數與CCS一道協同工作。顯示和分析工具可以通過COM API與RTDX通信,從而獲取目標系統數據,或將數據發送給DSP應用例程。
RTDX適合於各種控制、伺服和音頻應用。
DSP編程基礎
C54x的程序設計語言可以選擇:彙編語言和C語言。
彙編語言的優點:程序執行效率高,硬件定時準確;
缺點:程序不夠直觀,可移植性和可維護性差
C語言特點:可移植性和可維護性好
C54x C與ANSI C:
C54x C編譯器支持美國國家標準委員會(American Nation Standards Institute ,ANSI)開發的C語言標準。
C54x C與ANSI C的相同點:
概括地講,C54x C繼承了ANSI C的大部分基本特徵,只要與硬件不是特別相關的部分都是它們的相同點。
C54x C與ANSI C的不同點:
面向PC機的ANSI C對實時性要求不高,而 C54x C 的編程對象C54x DSP工作於實時性處理場合,對於處理時間有比較嚴格的實時性要求。
C54x的C語言數據類型及其表示範圍:
由於C54x是一種16位定點DSP,所處理的數據一般都是以字(word ,16bit)爲單位,而對於小於16位的數據的運算,需要配合邏輯和以爲運算來完成。
C54x編譯器將16位數據定義成最短的數據表示類型,如signed char, char, unsigned char, short, signed short, int, signed int, enum, unsigned int,* 指針都是16位數據,與ANSI C有較大區別。
對於16位表示範圍不夠的數據,C54x編譯器安排了32位的數據類型,32位的數據包括long, signed long, float, double, long double。這也是表示範圍最大的一種數據類型。與ANSI C有較大區別。
54x的C語言特有數據類型:
(1) 地址變量:對某一個存儲單元進行訪問,這個存儲單元可能是普通的數據存儲器單元,也可能是存儲器映像寄存器。 所謂的地址變量實際上就是指定了具體地址的指針變量。
加上 volatile 關鍵字,防止編譯器將其優化掉。
volatile short *mcbsp0_drr10=0x10;
(2) I/O端口變量:C54x的存儲空間有三個:程序存儲空間、數據存儲空間和I/O空間。爲了實現C訪問DSP的I/O空間,C54x C語言規定了一種I/O端口變量,對這些端口變量的訪問就是對I/O空間的訪問。
格式:ioport 數據類型 porthex_num;
其中, ioport:端口變量定義關鍵字;數據類型:只能是char, short, int, unsigned等16位類型;hex_num:該I/O端口的16進製表示的端口地址。
例子:ioport short port100; //定義了一個端口變量,端口地址是100h
(3) 寄存器變量:DSP的C語言擴展了寄存器變量。在一個C函數內部最多可以使用兩個寄存器變量,編譯器在編譯這兩個寄存器變量時用AR6和AR7這兩個輔助寄存器分別做了對應:
AR6被賦給第一個寄存器變量
AR7被賦給了第二個寄存器變量
寄存器變量的定義格式: register type AR6 或 register type AR7
DSP C語言關於變量的特殊規定:
DSP的C語言規定:沒有顯式初始化的變量仍保持未初始化狀態;
DSP的C語言規定,有符號數的右移等價於算術右移,即右移時符號位會擴展,這樣右移一位相當於除2;
DSP的C語言做了如下規定:餘數的符號與被除數的符號保持一致
10/-3==3, 10%-3==1
-10/3==-3, -10%3==-1
浮點數轉換到整數時,DSP的C語言採用朝0截止的方式,即簡單地去掉分數部分。
(標準C可以選擇是向下截取——取比該浮點數小的最大整數,向上截取——取比該浮點數大的最小整數)
TI公司的DSP C語言規定取最後一個字符有效:‘abc’==‘c’
C54x C語言編程
1.C54x C語言開發的段結構:
C編譯器對C語言源程序進行編譯後產生彙編程序,彙編程序再經過彙編將成爲COFF格式的目標文件,該文件將包含七個可以進行重新定位的代碼和數據段,他們是:
已初始化的段:
(1) .text段,包含了可執行代碼。
(2) .cinit段,包含明顯初始化的靜態變量和全局變量。 DSP的C語言全局變量和靜態變量,其存儲單元定義在 段.bss 中, 需要顯式初始化的值存放在段.cinit中。
(3) .const段,包含字符串常量和全局變量。
(4) .switch段,包含大型switch的跳轉表。
未初始化的段:
(1) .bss段,包含了未初始化的全局變量和靜態變量。
(2) .stack段,定義軟件堆棧。
(3) .system段,爲動態存儲器函數malloc、calloc、realloc(這些函數由運行支持庫提供)分配空間。
自定義段:
利用progma僞指令來產生其他的自定義段。
① CODE_SECTION pragma
例子:# pragma CODE_SECTION (symbol,“section name”)
這裏 ,section name代表了要產生的段名,而symbol代表了要彙編到該段的符號(如函數名)。
②DATA_SECTION pragma
例子:# pragma DATA_SECTION (symbol,“section name”)
這裏 ,section name代表了要產生的段名,而symbol代表了要彙編到該段的符號(如變量名)。
2.段的存儲器定位
段在鏈接時必須指定相應的存儲位置。
已初始化的段放在ROM 或者 RAM中;
未初始化的段放在RAM中;
自定義CODE_SECTION段放在ROM或者RAM中, DATA_SECTION段放在RAM中。
DSP編譯器支持兩種存儲器模式:
小存儲器模式(little endian):編譯器默認的存儲器模式。這要求.bss在128個字(一個數據頁)範圍內,這樣編譯器在編譯成彙編時,不需要修改DP的值,程序代碼簡單,運算效率高。
大存儲器模式(big endian):對.bss大小沒有限制,訪問變量 時需要首先確定DP值,這將增加指令訪問週期。
C54x C語言中 寄存器值的保存分成兩種基本類型,即入口保存和調用保存。
C54x C語言開發的標識符命名約定和混合語言編程:
--> 彙編程序中定義一個標識符_x,C語言程序調用是x,而不是_x。
C54 C語言中斷處理函數的實現:2種方法
1. c_intd 函數:C編譯器約定,任何具有名爲c_intd(d爲0~9)的函數都被假定爲一箇中斷程序。
2. interrupt 函數:
void interrupt isr()
{
…
}
中斷函數的幾點說明:
1)中斷函數的返回類型必須是void類型,並且不能有參數。
2)對中斷函數,其寄存器的保護不使用入口或調用保護規則;
3)在返回時中斷函數使用RETI。
4)中斷函數不能被普通C代碼之間調用
5)C編譯器規定進入中斷函數時,要求SP的內容是偶數;
6)如果屏蔽中斷時,用戶可以使用內嵌彙編語句來修改IMR使能或禁止指定的中斷。
7)一箇中斷程序可以處理一個或多箇中斷;
8)中斷處理和具體某種中斷的聯繫,由中斷向量來表明
9)在彙編語言中,訪問中斷處理函數是,加上“_”
TI公司提供兩種形式的運行支持庫(run-time-support library):
目標代碼:rts.lib
源代碼:rts.src
CCS工程中的文件:
1. *.cmd :用來分配存儲空間。
2. C語言系統庫rts55x.lib。系統庫包含了編譯器提供的所有功能,初始化C語言環境(入口地址是_c_int0),設置堆棧,標準C的函數庫。
3. *.map:存儲器映射文件