DSP課程筆記

數字信號處理

信號:信號是信息的載體,以某種函數的形式傳遞信息。這個函數可以是時間域、頻率域或其它域,但最基礎的域是時域

信號的分類:

    週期信號 / 非週期信號
    確定信號 / 隨機信號
    能量信號 / 功率信號
    連續時間信號 / 離散時間信號 / 數字信號

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:存儲器映射文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章