DFT圆周卷积典例

  |  

题目

已知x(n)={1,0,2,1,3},求x(n)∗x(n),x(n)⑤x(n),x(n)⑩x(n)

解答过程

(1)x(n)∗x(n)

列表:

把划线中间的区域各自加起来

得到:

y(n)=[10421041369]y(n)= \left[ \begin{matrix} 1 \\ 0 \\ 4 \\ 2 \\ 10 \\ 4 \\ 13 \\ 6 \\ 9 \end{matrix} \right]

待续…

C语言实现

线性卷积序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void conv(int x[],int y[]){
int n,s=0;
for(n=1;n<=9;n++){
y[n]=0;
for(int m=0;m<=n-1;m++){
s=n-m-1;
if(m<0||m>=5){
y[n]+=0;}
else if(s<0||s>=5){
y[n]+=0;}
else
y[n]+=x[m]*x[s];
}
}
}

5点圆周卷积

1
2
3
4
5
6
7
8
9
10
11
void R_5(int x[],int y[]){
int t=0;
for(int n=0;n<5;n++){
y[n]=0;
for(int m=0;m<5;m++){
t=(n-m);
if(t<0){t=t+5;}
y[n]+=x[t]*x[m];
}
}
}

10点圆周卷积

1
2
3
4
5
6
7
8
9
10
11
void R_10(int x[],int y[]){
int t=0;
for(int n=0;n<10;n++){
y[n]=0;
for(int m=0;m<10;m++){
t=(n-m);
if(t<0){t=t+10;}
y[n]+=x[t]*x[m];
}
}
}

运行结果


完整代码(实际用的是C++)

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include<iostream>
using namespace std;

/*线性卷积*/
void conv(int x[],int y[]){
int n,s=0;
for(n=1;n<=9;n++){
y[n]=0;
for(int m=0;m<=n-1;m++){
s=n-m-1;
if(m<0||m>=5){
y[n]+=0;}
else if(s<0||s>=5){
y[n]+=0;}
else
y[n]+=x[m]*x[s];
}
}
}

/*5点圆周卷积*/
void R_5(int x[],int y[]){
int t=0;
for(int n=0;n<5;n++){
y[n]=0;
for(int m=0;m<5;m++){
t=(n-m);
if(t<0){t=t+5;}
y[n]+=x[t]*x[m];
}
}
}

/*10点圆周卷积*/
void R_10(int x[],int y[]){
int t=0;
for(int n=0;n<10;n++){
y[n]=0;
for(int m=0;m<10;m++){
t=(n-m);
if(t<0){t=t+10;}
y[n]+=x[t]*x[m];
}
}
}

int main(int argc, const char** argv) {
int x[10]={1,0,2,1,3};
int y_conv[10]={0},y_5[10]={0},y_10[10];
int y_conv_temp[15]={0};
conv(x,y_conv_temp);
/*
for(int i=1;i<=9;i++){
cout<<"y_conv["<<i<<"]="<<y_conv[i]<<endl;
}
*/
for(int k=0;k<10;k++){
y_conv[k]=y_conv_temp[k+1];
}
R_5(x,y_5);
/*
for(int i=0;i<=4;i++){
cout<<"y_5["<<i<<"]="<<y_5[i]<<endl;
}
*/
R_10(x,y_10);
/*
for(int i=0;i<=9;i++){
cout<<"y_10["<<i+1<<"]="<<y_10[i]<<endl;
}
*/

for(int i=0;i<=9;i++){
cout<<"y_conv["<<i+1<<"]="<<y_conv[i]<<" "<<"y_5["<<i+1<<"]="<<y_5[i]<<" "<<"y_10["<<i+1<<"]="<<y_10[i]<<endl;
}
return 0;
}
文章目录
  1. 题目
  2. 解答过程
    1. (1)x(n)∗x(n)
  3. C语言实现
    1. 线性卷积序列
    2. 5点圆周卷积
    3. 10点圆周卷积
    4. 运行结果
    5. 完整代码(实际用的是C++)
本站总访问量 | 本页面被访问 | 本站访客数
载入天数...载入时分秒...