DSP笔记
第1讲数字信号处理概述
ARM 高 FPGA(在纯软件的环境下开发硬件)
DSP 中
单片机 低
软解软件进行处理
硬解硬件进行处理
1-D 信号:单个独立变量的一维函数, e.g. 语音信号。
2-D 信号:两个独立变量的二维函数, e.g. 图像信号。
M-D 信号:多个独立变量的多维函数, e.g. 彩 {MOD}视频信号(RGB) 。
信号分类
模拟信号处理 连续信号
数字信号处理 离散信号
系统的分类(按所处理的信号种类不同分类)
-连续时间信号系统(模拟信号系统)
-离散时间信号系统(略)
-数字信号系统
运算的基本单元是延时器、乘法器和加法器。
数字信号处理系统的基本组成
(1)前置滤波器
将输入信号xa(t)中高于某一频率(称折叠频率,等于抽样频率的一半)的分量加以滤除。
(2)A/D变换器
在A/D变换器中每隔T秒(抽样周期)取出一次xa(t)的幅度,抽样后的信号称为离散信号。在A/D变换器中的保持电路中进一步变换为若干位码。
(3)数字信号处理器(DSP)
按照预定要求,在处理器中将信号序列x(n)进行加工处理得到输出信号y(n)。
(4)D/A变换器
由一个二进制码流产生一个阶梯波形,是形成模拟信号的第一步。
(5)模拟滤波器
把阶梯波形平滑成预期的模拟信号;以滤除掉不需要的高频分量,生成所需的模拟
信号ya(t)。
数字处理特点
1)高精度
2)高可靠性
3)灵活性
4)虚拟特点和更新
DSP概念
狭义理解可为DigitalSignal Processor
—— 数字信号处理
广义理解可为DigitalSignal Processing
——数字信号处理技术
本科阶段主要介绍以傅里叶变换为基础的“经典”处理方法,主要包括:
(1)离散傅里叶变换及其快速算法。
(2)滤波理论(线性时不变离散时间系统,用于分离相加性组合的信号,要求信号频谱占
据不同的频段)。
数字信号处理的标志:傅立叶变换
频域分析
时域分析在时域上无法分析的可以在频域上分析
应用
GPSDVD 图像识别 指纹识别
第2讲 matlab基础及其在dsp中的应用
Matlab的操作
M文件分为命令和函数文件
for循环
s=0;
for n=1:100;
s=s+1/n^2
end
function
function y=functest(x)
y=x^2+3.2*x-1.7
end
if
function y=iftest(x)
if x<=0;
y=0;
elseif x<=1;
y=1;
elseif x<=2;
y=2*x;
else
y=2*x+5;
end
plot fplot绘图 subplot子图 Figure新建绘图窗口 hold on保持上幅图
figure
subplot(311)
fplot('x+sin(x)',[-5,5])
subplot(312)
fplot('x^2*exp(-x^2)',[-10,10])
subplot(313)
fplot('x^4/2+x^2-1',[-10,10])
linspace矩阵
x=linspace(1,5);
y1=sin(2*x);
y2=sin(x.^2);
plot(x,y1,x,y2)
求导数
一阶导数
>> syms x;
>> y = 3*x-exp(x)/2+1;
>> dy=diff(y);
>> pretty(dy) pretty优化输出结果 可有可无
exp(x)
3 -------
2
dy =3 - exp(x)/2
>> syms x y1 y2
>> y1=2^(sin(x));y2=log(log(log(x)));
>> dy1=diff(y1),dy2=diff(y2)
dy1 =2^sin(x)*log(2)*cos(x)
dy2 =1/(x*log(log(x))*log(x))
二阶导数
>> syms x;
>> diff((cos(x))^2*log(x),2)
ans =2*log(x)*sin(x)^2 - 2*cos(x)^2*log(x)- cos(x)^2/x^2 - (4*cos(x)*sin(x))/x
求驻点
>> x=solve('x^2-x-6')
x =-2x=3
特征值和特征向量
MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有3种:
(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的特征值和特征向量。
用一个简单命令求解线性系统
3x1+ x2- x3 =3.6
x1+2x2+4x3= 2.1
-x1+4x2+5x3= -1.4
A=[3 1 -1;1 2 4;-1 4 5];b=[3.6;2.1;-1.4];
x=A %注意除法的符号
x =
1.4818
-0.4606
0.3848
MATLAB提供了丰富的矩阵运算处理功能,是基于矩阵运算的处理工具。
考察函数
第3讲算法设计信号部分
用FFT(傅里叶变换)进行谱分析的Matlab实现
要求看懂程序 代码填空
例如
设模拟信号
,以 t= 0.01n (n=0: N-1) 进行取样,试用fft函数对其做频谱分析。N分别为:(1) N=45;(2) N=50;(3) N=55;(2) N=60。
程序清单如下
%计算N=45的FFT并绘出其幅频曲线
N=45;n=0:N-1;t=0.01*n;
q=n*2*pi/N;
x=2*sin(4*pi*t)+5*cos(8*pi*t);
y=fft(x,N);
figure(1)
subplot(2,2,1)
plot(q,abs(y))
title('FFTN=45')
用FFT进行谱分析的Matlab实现
设计butterworth低通滤波器
信号波形
用以下程序可产生正弦波:
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);
单位脉冲序列
n=[-3:3];
x=[(n-1)==0]; 生成单位脉冲序列
stem(n,x);
axis([-3,3,0,1.5]) 标识坐标
矩形序列
正玄序列
>> n=[0:1:20];
>> x=3*sin(0.1*pi*n+pi/3);
>> stem(n,x); 离散的序列值
>> axis([0,20,-4,4])
第3讲算法设计图像部分图片读取
按图像明暗程度和空间坐标的连续性划分,图像可以分为数字图像和模拟图像。
模拟图像:也称光学图像,是指空间坐标和明暗程度连续变化的,计算机无法直接处理的图像,它属于可见图像。
数字图像:是指能被计算机存储、处理和使用的图像,是空间坐标和灰度均不连续,用离散数字表示的图像A/D(模/数转换) D/A (数/模转换)
采样(空间离散) 空间上连续的图像变化成离散点的操作成为采样,实际上是空间坐标(x,y)的数字化,即按一定的间隔(△x, △ y)将图像划分M行×N列的网格。
量化(灰度离散) 图片包含 {MOD}彩数目。
1 按灰度值可分为二值图像和多值图像
二值图像:每个像素灰度由0或1构成
多值图像:每个象素灰度由0~2n之间的数表示(n>1)
2 按波段量可分为单波段、彩 {MOD}或多波段数字图像
1图像读取
函数和语法
A = imread(filename,fmt)
[X,map] = imread(filename,fmt)% X索引值map索引表
load filename %(对于索引图,*.mat格式的数据等)
tu=imread('football.jpg')
tu=imread('forest.tif');
load woman
1图像显示
一般的方式
>> imshow(uint8(ans))
>> imread('D:Matlabwork加菲猫.jpg')
>> A=imread('D:Matlabwork加菲猫.jpg');
>> imshow(uint8(A));
Matlab自带图片读取
>> load woman
>> imshow(X,map)
imview('D:Matlabwork加菲猫.jpg')显示一张图片 不常用
图像显示函数及其调用方法
1)一般的方式
2)彩 {MOD}图像的显示
3)索引图的显示
4)彩 {MOD}图像的显示
5)灰度图像的显示
6)truesize的使用
7)图像显示中逻辑操作符的使用(常用于二值图像)
Matlab图像处理
1)图像的几何运算 resize不善于用subplot来进行操作
2)图像的亮度调整
3)图像中斑点的去除
4)图像的轮廓
5)图像的边界
6)图像间的运算
7)特定区域的处理
课程探究
Jpg图像压缩
图像复原
Fir低通滤波器
伪彩 {MOD}
切比雪夫滤波器
将图片转换为ASCII
车牌识别
图片处理程序
第4讲 55系列dsp基础
嵌入式产品关注性能、价格、功耗三个指标
德州仪器三大DSP系列
C55x根据功能的不同将CPU分为4个单元,即指令缓冲单元(I)、程序流程单元(P)、地址流程单元(A)和数据计算单元(D)。
指令缓冲单元
程序流程单元(P)
程序流程单元由程序地址产生电路和寄存器组构成。程序流程单元产生所有程序空间的地址,并控制指令的读取顺序。
地址流程单元(A)
地址流程单元包括数据地址产生电路、算术逻辑电路和寄存器组构成。
数据计算单元(D)
数据计算单元由移位器、算术逻辑电路、乘法累加器和寄存器组构成。D单元包含了CPU的主要运算部件。
指令流水线
第一阶段是取流水线,即从内存中取出32位的指令包,放入指令缓冲队(IBQ)中,然后为流水线的第二阶段提供48位的指令包。
第二阶段是指执行流水线,这部分的功能是对指令进行解码,完成数据的存取和计算。
VC5509A的主要特性
1.CPU
2.存储器
3.片上外设
引脚功能
1.并行总线引脚
2.中断引脚和复位引脚
3.位输入/输出信号引脚
4.时钟信号引脚
5.I2C引脚
6.McBSP信号引脚
7.USB引脚
8.A/D引脚
9.测试引脚
10.电源引脚
第5讲 CCS与DSP开发
CCS有两种工作模式,即
软件仿真器模式:可以脱离DSP芯片,在PC机上模拟DSP的指令集和工作机制,主要用于前期算法实现和调试。
硬件在线编程模式:可以实时运行在DSP芯片上,与硬件开发板相结合在线编程和调试应用程序。(主要使用这种模式)
主机和开发板通过仿真器相连(RTDX、jtag-h)
第6讲 DSP编程基础
汇编语言的优点:程序执行效率高,硬件定时准确;
缺点:程序不够直观,可移植性和可维护性差
C语言特点:可移植性和可维护性好
程序设计是应用软件设计的基础,主要任务是利用C指令和伪指令编写源程序以完成指定的功能。
C54x C与ANSI C的不同点
1.所处理数据的性质不同
2.数据出输入输出设备不同
3.“死循环”的对待上不同
4.语法及数据结构细节上的不同
1)地址变量 所谓的地址变量实际上就是指定了具体地址的指针变量。 volatile short *mcbsp0_drr10=0x10;short sh_drr10_data;sh_drr10_data=*mcbsp0_drr10
2)I/O端口变量 ioport数据类型 porthex_num;
3)寄存器变量 寄存器变量的定义格式:registertype AR6 或 register type AR7
段
已初始化段:
(1).text段,包含了可执行代码。
(2).cinit段,包含明显初始化的全局变量和静态变量。
(3).const段,包含字符串常数和全局变量。
(4).switch段,包含大型switch语句的跳转表
未初始化段
(1).bss段,包含了未初始化的全局变量和静态变量
(2).stack段,定义软件堆栈
(3).system段,为动态存储器函数malloc,calloc,realloc(这些函数由运行支持库提供)分配存储器空间
C54x C语言开发的存储器结构
(1)段的存储器定位
(2) 存储器模式
①小存储器模式:编译器默认的存储器模式。这要求.bss在128个字(一个数据页)范围内,这样编译器在编译成汇编时,不需要修改DP的值,程序代码简单,运算效率高。
高地址存放在高位低地址存放在低位。
②大存储器模式:对.bss大小没有限制,访问变量时需要首先确定DP值,这将增加指令访问周期
高地址存放在低位,低地址存放在高位。
C54x C语言开发的寄存器约定规则
入口保存(save-on-entry)
调用保存(save-on-call)
C54x C语言中断处理函数的实现
C语言中断函数的定义
(1) c_intd 函数
C编译器约定,任何具有名为c_intd(d为0~9)的函数都被假定为一个中断程序。
缺点:可以定义的中断处理函数数目较少(只有9个),另外,函数名称与其功能的对应关系不够直观。因此,除了c_int0函数外,一般不建议使用这种定义方法。
(2 ) interrupt 函数
采用这种方法,可以对每种中断服务函数的功能,给它起一个有意义的名称,非常直观,同时,中断服务函数的个数也没有严格的限制。
TI公司提供两种形式的运行支持库:
目标代码:rts.lib
源代码:rts.src
DSP的C编程文件结构
工程文件.mak (.prj)包含:
1. CMD--用来分配存储空间
MEMORY指令定义目标存储器的位置,SECTIONS指令规定各个段放在存储器的什么位置。
2.C语言系统库rts55x.lib。系统库包含了编译器提供的所有功能,初始化C语言环境(入口地址是_c_int0),设置堆栈,标准C的函数库。
3.有且必须有一个含有main()函数的C语言源文件(.c)。系统初始化完毕后,就把控制权交给main()函数。
4.目录下的文件:.map文件(存储器映射文件)、.out文件、cc_build文件
Hello, world实例:file.c
#include
FILE*fptr;
/* ======== main ======== */
void main()
{
/*write a string to stdout */
puts("hello world!
");
/* open a file on the host and write char array */
fptr= fopen("myfile.txt", "wb+");
if(fptr==NULL)
{
puts("error");
}
fprintf(fptr,"Hello, world");
fclose(fptr);
}
汇编实例:add.asm
.file "addasm.asm"
.data
.global _c_int00
.text
_c_int00:
mov #10,AR0
mov #10,AR1
add AR0,AR1
loop:
nop
B loop
.end
C+汇编实例:
#include
int c;
void main()
{
c=cadd(10,10);
asmadd();
}
int cadd(int a,int b)
{
int result;
result=a+b;
return result;
}
定点浮点运算
浮点和定点运算 给代码和已知数求运算过程
//加法过程
x=0.5 y=3.1
Qx=15 Qy=13 Qz=13
Xq=0.5*2^15=16384
Yq=3.1*2^13=int(25395)
temp = Yq<< Qx-Qy)
=25395<<2
=25395*4=101580
temp=Xq+temp=16384+101580=117964
Zq=117964>>2=117964/4=29491
z=(float)Zq*2^-13=3.6
//减法过程
x=3.0 y=3.1 Z=?
Qx=13 Qy=13 Qz=15
X=int(x*2^13)=3*2^13=24576
Y=int(y*2^13)=3.1*2^13=25395
temp=y<<0=25395
temp=x-temp
=24576-25395=-819
Z=-819<<2=-819*4=-3276
z=-3276*2^-15=-0.1
//乘法过程
x=18.4 y=36.8
Qx=10 Qy=9 Qz=15
tmp=x=18841
Zq=18841<<(15-10+9)/18841
=18841*2^14/18841=16384
Zfloat=16384*2^-15=0.5
//除法过程
X=18.4 y=36.8
Qx=10 Qy=9 Qz=15
Xq=18.4*2^10=18841
Yq=36.8*2^9=18841
temp=(long)=18841
Zq=temp*Yq>>(10+9-5)
=temp*Yq>>14
=18841*18841>>14
=21666
1、选择
2、填空
3、程序分析
给代码分析求代码功能或结果
Matlab脚本 DSPc语言代码
4、程序设计题
Matlab脚本 DSPc语言代码
5、论述综合题
上课所讨论的问题