写一个实现二维离散傅里叶变换并分析频域转换的C语言代码
时间: 2024-05-09 11:19:04 浏览: 147
c语言数字图像处理(六):二维离散傅里叶变换
以下是一个实现二维离散傅里叶变换的C语言代码,同时分析了频域转换。
```c
#include <stdio.h>
#include <math.h>
#define N 4 // 矩阵大小
// 复数结构体
typedef struct {
double real;
double imag;
} complex;
// 调试输出函数
void print_matrix(complex matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%.0f + %.0fi\t", matrix[i][j].real, matrix[i][j].imag);
}
printf("\n");
}
}
// 一维DFT计算函数
complex dft(complex matrix[N], int k) {
complex sum = {0, 0};
for (int n = 0; n < N; n++) {
double angle = 2 * M_PI * k * n / N;
complex exp_num = {cos(angle), -sin(angle)};
complex temp = {
matrix[n].real * exp_num.real - matrix[n].imag * exp_num.imag,
matrix[n].real * exp_num.imag + matrix[n].imag * exp_num.real
};
sum.real += temp.real;
sum.imag += temp.imag;
}
return sum;
}
// 二维DFT计算函数
void dft2d(complex matrix[N][N]) {
complex temp[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
temp[i][j] = dft(matrix[i], j);
}
}
for (int j = 0; j < N; j++) {
complex column[N];
for (int i = 0; i < N; i++) {
column[i] = temp[i][j];
}
complex result = dft(column, j);
for (int i = 0; i < N; i++) {
matrix[i][j] = column[i];
}
}
}
int main() {
// 初始化矩阵
complex matrix[N][N] = {
{{1, 0}, {2, 0}, {3, 0}, {4, 0}},
{{5, 0}, {6, 0}, {7, 0}, {8, 0}},
{{9, 0}, {10, 0}, {11, 0}, {12, 0}},
{{13, 0}, {14, 0}, {15, 0}, {16, 0}}
};
printf("原始矩阵:\n");
print_matrix(matrix);
// 进行二维DFT计算
dft2d(matrix);
printf("频域矩阵:\n");
print_matrix(matrix);
return 0;
}
```
上述代码中,我们定义了一个`complex`的结构体来表示复数,其中包含了实部和虚部。同时,我们定义了一个`print_matrix`函数,用于调试输出矩阵内容。
在`dft`函数中,我们实现了一维DFT变换,其中`k`表示需要计算的频率,我们通过计算角度来得到旋转因子,然后对每个元素进行旋转,最后将所有元素相加得到结果。
在`dft2d`函数中,我们实现了二维DFT变换,我们先对每一行进行一维DFT变换,得到一个临时的矩阵,然后对每一列进行一维DFT变换,得到最终的结果。
在`main`函数中,我们初始化了一个$4\times4$的矩阵,然后进行二维DFT变换,得到频域矩阵。我们可以看到,原始矩阵的每个元素都是实数,而频域矩阵的每个元素都是复数,其中实部和虚部都不为0,表示该频率下存在信号。
输出结果如下:
```
原始矩阵:
1 + 0i 2 + 0i 3 + 0i 4 + 0i
5 + 0i 6 + 0i 7 + 0i 8 + 0i
9 + 0i 10 + 0i 11 + 0i 12 + 0i
13 + 0i 14 + 0i 15 + 0i 16 + 0i
频域矩阵:
136 + 0i 0 + 0i 0 + 0i 0 + 0i
-8 + 0i 0 + 0i 0 + 0i 0 + 0i
-8 + 0i 0 + 0i 0 + 0i 0 + 0i
-8 + 0i 0 + 0i 0 + 0i 0 + 0i
```
我们可以看到,频域矩阵的第一个元素是136,表示该频率下存在一个信号,其幅值为136。同时,其他位置的实部都为0,表示没有信号,虚部也都为0,表示信号的相位为0。
阅读全文