实验一 基本操作

  1. 按照CCS帮助中Tutorial的操作步骤,实现建立工程、编写代码、查看变量、调试程序、文件输入、结果分析的步骤。

实验记录

实验二 C语言实验

  1. 利用MATLAB的滤波器设计软件,生成低通滤波器、高通滤波器,分别给出滤波器系数。
  2. 利用MATLAB产生由不同的正弦波合成的波形文件,送入CCS。
  3. 编写C程序,分别实现低通、高通滤波,用CCS画出波形,给出结果分析。
  4. 利用编译器的op选项,对实验二的C语言程序按照级别进行优化,给出耗时的变化的分析。
  5. 应用CCS的内联函数实现低通、高通滤波,与步骤1中的耗时进行比较。

低通

利用matlab生成FIR滤波器系数,FIR滤波器配置如下:

lpf.h

1
2
3
4
5
6
#include "tmwtypes.h"
const int BL = 17;
const int16_T B[17] = {
37, 132, 62, -525, -1204, -255, 3642, 8839, 11307,
8839, 3642, -255, -1204, -525, 62, 132, 37
};

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdio.h"
#include "lpf.h"
#include <math.h>
#include <stdlib.h>


#define Length 1024
#define pi 3.1415926


int fs=4096; //采样频率
int f1=100; //信号频率
int f2=1500; //噪声频率

#define w1 2*pi*f1/fs //信号角频率
#define w2 2*pi*f2/fs //噪声角频率


long yn; //保存滤波后结果,32位长整型
long input[Length]; //
long output[Length];



inline void creatSin(){
int i;
for(i=0;i<Length;i++)
input[i]=1024*sin(w1*i)+1024*sin(w2*i); //待滤波信号,乘以1024转换为Q10格式(sin范围为-1~1,将其转换为整数格式)
}


inline void lowPass(){
int m,n;

for(n=0;n<Length+BL;n++) //卷积计算
{
yn=0;
for(m=0;(m<BL)&&(m<n);m++)
yn+=B[m]*input[n-m];
output[n]=yn;
}
}


void main() {

creatSin();
lowPass();
while(1);

}

低通:

自生成的输入波形时域图:

image-20211214111746296

输入波形频域图:

image-20211214111807245

经16阶低通滤波器后的输出波形时域图:

image-20220204221106074

输出波形频域图:

image-20211214111851184

可以看出1.5kHz的信号已被滤掉

滤波运行时间:

image-20211214190933696

17,620,212个时钟周期

使用内联函数:

image-20211225131713646

op level0:

image-20211225131713646

op level1:

image-20211225131906745

op level2:

image-20211225132106709

op level3:

image-20211225132422581

高通

利用matlab生成FIR滤波器系数,FIR滤波器配置如下:

image-20211214113010223

hpf.h

1
2
3
4
5
6
#include "tmwtypes.h"
const int BL = 17;
const int16_T B[17] = {
-14, -106, -180, 253, 1220, 889, -3044, -9228, 20421,
-9228, -3044, 889, 1220, 253, -180, -106, -14
};

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "stdio.h"
#include "hpf.h"
#include <math.h>
#include <stdlib.h>

#define Length 1024
#define pi 3.1415926


int fs=4096; //采样频率
int f1=100; //信号频率
int f2=1500; //噪声频率

#define w1 2*pi*f1/fs //信号角频率
#define w2 2*pi*f2/fs //噪声角频率


long yn; //保存滤波后结果,32位长整型
long input[Length]; //
long output[Length];
int i;


inline void creatSin(){
int i;
for(i=0;i<Length;i++)
input[i]=1024*sin(w1*i)+1024*sin(w2*i); //待滤波信号,乘以1024转换为Q10格式(sin范围为-1~1,将其转换为整数格式)
}

inline void highPass(){
int m,n;

for(n=0;n<Length+BL;n++) //卷积计算
{
yn=0;
for(m=0;(m<BL)&&(m<n);m++)
yn+=B[m]*input[n-m];
output[n]=yn;
}
}

void main() {
creatSin();
highPass();
while(1);
}

输入波形时域图:

image-20211214114202507

输入波形频域分析:

image-20211214114241011

经高通滤波后的输出信号时域图:

image-20211214114314986

输出信号频域分析:

image-20211214114332867

滤波运行时间:

17,619,874个时钟周期。

内联函数:

image-20211225133227841

op level1:

image-20211225133227841

op level2:

image-20211225133755586

op level3:

image-20211225133936091

实验三 汇编实验

  1. MATLAB的滤波器设计软件,生成低通滤波器、高通滤波器,分别给出滤波器系数。
  2. 利用MATLAB产生由不同的正弦波合成的波形文件,送入CCS。
  3. 编写汇编程序,分别实现低通、高通滤波,用CCS画出波形,给出结果分析。
  4. 与实验二的耗时进行比较。

低通

输入波形数据文件 firin.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.word 0
.word 17855
.word -4798
.word 26722
.word 16384
.word 3551
.word 27969
.word -5315
.word 0
.word 5315
.word -27969
.word -3551
.word -16383
.word -26722
.word 4798
.word -17854
.word 0
.word 17855
.word -4798
.word 26721
.word 16384
.word 3551
.word 27969
.word -5314
.word 0
.word 5316
.word -27969
.word -3552
.word -16383
.word -26722
.word 4798
.word -17854
.word -1
.word 17855
.word -4798
.word 26721

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.mmregs
.global start
.def start
.def _c_int00
K0 .set 1
K .set 265 ;输入样本数据个数
input: .word 0,0,0,0,0,0,0,0,0
.copy "firin.inc"
output: .space 1024
table .sect "table" ;FIR 滤波器系数
N .set 10 ;FIR 滤波器阶数
N1: .word -79,239,1986,5541,8695,8695,5541,1986,239,-79
.data
.text
_c_int00 b start
nop
nop
start: RSBx FRCT ;小数乘法编程时,设置 FRCT(小数方式)位
STM input,AR1 ;AR1 指向 FIR 滤波器输入数据存储空间地址
STM output,AR4 ;AR4 指向 FIR 滤波器输出数据存储空间地址
STM #K-1,BRC
RPTB LOOP
SUB A
MVMM AR1,AR2
STM N1,AR3
RPT #N-1
MAC *AR2+,*AR3+,A
STH A,*AR4+
LOOP: LD *AR1+,A
EEND B EEND
.end

输入波形频域分析:

image-20211214195834170

经低通滤波器后的输出波形频域分析:

image-20211214195901226

高通

输入波形数据文件 firin.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.word 0
.word 21406
.word 23170
.word 8866
.word 0
.word 8866
.word 23170
.word 21406
.word 0
.word -21406
.word -23170
.word -8867
.word 0
.word -8866
.word -23170
.word -21406
.word 0
.word 21406
.word 23170
.word 8867
.word 0
.word 8866
.word 23170
.word 21406
.word 0
.word -21406
.word -23170
.word -8867
.word 0
.word -8866
.word -23170
.word -21407
.word 0
.word 21406
.word 23170
.word 8867
.word 0
.word 8866
.word 23170
.word 21407
.word 0
.word -21406
.word -23170
.word -8867
.word 0

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.mmregs
.global start
.def start
.def _c_int00
K0 .set 1
K .set 265 ;输入样本数据个数
input: .word 0,0,0,0,0,0,0,0,0
.copy "firin.inc"
output: .space 1024
table .sect "table" ;FIR 滤波器系数
N .set 10 ;FIR 滤波器阶数
N1: .word 168,259,-430,-3401,-7737,23055,-7737,-3401,-430,259,168
.data

.text
_c_int00 b start
nop
nop
start: RSBx FRCT ;小数乘法编程时,设置 FRCT(小数方式)位
STM input,AR1 ;AR1 指向 FIR 滤波器输入数据存储空间地址
STM output,AR4 ;AR4 指向 FIR 滤波器输出数据存储空间地址
STM #K-1,BRC
RPTB LOOP
SUB A
MVMM AR1,AR2
STM N1,AR3
RPT #N-1
MAC *AR2+,*AR3+,A
STH A,*AR4+
LOOP: LD *AR1+,A
EEND B EEND
.end

输入波形频域分析:

经高通滤波器后的输出频域分析:

image-20211214195528873

实验四 综合实验

  1. 采集一段语音信号,通过抽取和插值操作,实现音调的变化,并给出频谱的变化结果。

输入信号数据:

data.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#define length 512
const int fs = 44100;
short data[length] = {-66 ,-43 ,-23 ,-3 ,19 ,47 ,79 ,115 ,155 ,195 ,
233 ,263 ,282 ,291 ,285 ,266 ,238 ,205 ,170 ,141 ,
118 ,103 ,97 ,96 ,100 ,108 ,118 ,131 ,144 ,153 ,
158 ,162 ,166 ,168 ,170 ,171 ,171 ,165 ,153 ,137 ,
122 ,110 ,99 ,83 ,61 ,39 ,18 ,1 ,-7 ,-3 ,
10 ,32 ,61 ,91 ,120 ,144 ,164 ,181 ,193 ,194 ,
179 ,151 ,117 ,83 ,57 ,42 ,42 ,57 ,82 ,112 ,
144 ,169 ,185 ,189 ,181 ,160 ,126 ,77 ,20 ,-36 ,
-84 ,-114 ,-124 ,-116 ,-92 ,-62 ,-39 ,-27 ,-26 ,-36 ,
-50 ,-61 ,-69 ,-72 ,-78 ,-90 ,-108 ,-129 ,-154 ,-177 ,
-192 ,-194 ,-178 ,-145 ,-99 ,-49 ,-8 ,15 ,21 ,10 ,
-12 ,-41 ,-69 ,-93 ,-115 ,-136 ,-156 ,-172 ,-179 ,-175 ,
-162 ,-143 ,-123 ,-102 ,-81 ,-65 ,-57 ,-56 ,-63 ,-76 ,
-93 ,-111 ,-128 ,-142 ,-154 ,-165 ,-176 ,-186 ,-192 ,-192 ,
-183 ,-169 ,-150 ,-128 ,-101 ,-67 ,-28 ,9 ,45 ,75 ,
98 ,114 ,123 ,127 ,124 ,113 ,98 ,82 ,67 ,57 ,
47 ,34 ,14 ,-12 ,-45 ,-82 ,-120 ,-153 ,-178 ,-193 ,
-197 ,-192 ,-182 ,-169 ,-155 ,-143 ,-135 ,-132 ,-135 ,-146 ,
-166 ,-190 ,-207 ,-210 ,-198 ,-172 ,-134 ,-92 ,-51 ,-15 ,
17 ,43 ,54 ,51 ,37 ,18 ,-1 ,-19 ,-33 ,-37 ,
-26 ,-3 ,29 ,66 ,102 ,133 ,154 ,166 ,173 ,175 ,
173 ,164 ,149 ,128 ,102 ,76 ,53 ,35 ,22 ,10 ,
-6 ,-28 ,-52 ,-73 ,-90 ,-104 ,-113 ,-115 ,-111 ,-105 ,
-100 ,-98 ,-95 ,-86 ,-72 ,-53 ,-31 ,-11 ,0 ,0 ,
-5 ,-14 ,-20 ,-19 ,-8 ,9 ,31 ,51 ,65 ,74 ,
76 ,69 ,54 ,33 ,10 ,-11 ,-27 ,-37 ,-34 ,-18 ,
3 ,25 ,48 ,68 ,81 ,82 ,71 ,54 ,33 ,12 ,
-7 ,-25 ,-41 ,-53 ,-61 ,-70 ,-76 ,-78 ,-78 ,-75 ,
-68 ,-56 ,-39 ,-17 ,9 ,38 ,70 ,103 ,133 ,157 ,
176 ,194 ,211 ,228 ,243 ,258 ,271 ,281 ,290 ,299 ,
307 ,314 ,317 ,318 ,317 ,312 ,300 ,286 ,278 ,282 ,
302 ,333 ,368 ,393 ,401 ,389 ,359 ,316 ,269 ,227 ,
196 ,182 ,179 ,177 ,175 ,171 ,160 ,143 ,121 ,99 ,
78 ,55 ,34 ,15 ,-1 ,-15 ,-24 ,-26 ,-24 ,-19 ,
-16 ,-16 ,-20 ,-27 ,-38 ,-48 ,-56 ,-58 ,-55 ,-47 ,
-34 ,-19 ,-2 ,15 ,35 ,55 ,72 ,82 ,82 ,72 ,
56 ,37 ,17 ,-1 ,-16 ,-24 ,-26 ,-23 ,-20 ,-21 ,
-31 ,-51 ,-77 ,-104 ,-128 ,-147 ,-161 ,-170 ,-178 ,-186 ,
-193 ,-200 ,-202 ,-201 ,-201 ,-207 ,-222 ,-246 ,-278 ,-316 ,
-355 ,-391 ,-418 ,-431 ,-431 ,-421 ,-405 ,-390 ,-381 ,-377 ,
-374 ,-369 ,-360 ,-349 ,-334 ,-314 ,-291 ,-265 ,-234 ,-200 ,
-170 ,-149 ,-137 ,-139 ,-154 ,-175 ,-196 ,-209 ,-215 ,-213 ,
-206 ,-190 ,-164 ,-132 ,-94 ,-49 ,0 ,46 ,87 ,120 ,
143 ,157 ,165 ,168 ,168 ,163 ,151 ,135 ,114 ,91 ,
68 ,46 ,28 ,17 ,14 ,20 ,33 ,48 ,66 ,85 ,
106 ,126 ,141 ,147 ,142 ,126 ,101 ,71 ,42 ,20 ,
8 ,7 ,17 ,34 ,56 ,80 ,105 ,131 ,159 ,187 ,
216 ,244 ,264 ,272 ,263 ,238 ,198 ,153 ,111 ,81 ,
65 ,63 ,72 ,88 ,105 ,119 ,131 ,141 ,150 ,161 ,
170 ,175 ,177 ,173 ,165 ,152 ,133 ,107 ,70 ,23 ,
-27 ,-72 ,-102 ,-110 ,-97 ,-66 ,-26 ,14 ,46 ,61 ,
57 ,40 };

输入声音信号频域分析:

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include "data.h"
short output1[2*length];
short output2[length/2];
void main()
{int i;
for(i=0;i<length;i++)
{
//实现信号的插值
output1[i*2]=data[i];
output1[i*2+1]=0;
//实现信号的抽取
if(i%2==0)
{
output2[i/2]=data[i];
}
}
while(1);
}

序列的时域插值

每两点之间等间隔插入1个零点(将输入信号的抽样频率增大2倍)

插值后的频域分析:

image-20211214203929944

序列的时域抽取

每两点之间抽取一个序列(将输入信号的抽样频率减小2倍)

抽取后的频域分析:

image-20211214204206271

工程文件下载

链接:https://pan.baidu.com/s/1LUxDQlgQNojqSie6rKdgXQ
提取码:uqb9