【发布时间】:2020-09-25 12:30:32
【问题描述】:
我正在使用复数到实数的 2D IDFT 将复数信号可视化为图像。我通过手动设置模式来初始化复杂的频域。但是,某些模式产生的实际输出似乎是预期的两倍。
我的代码:
int N = 8;
int logical_width = N / 2 + 1; // Logical width of frequency domain data
double* T = new double[N * N];
fftw_complex* F = (fftw_complex*)fftw_alloc_complex(N * logical_width);
fftw_plan plan = fftw_plan_dft_c2r_2d(N, N, F, T, FFTW_MEASURE);
// Initialize all frequency modes to 0
for (int i = 0; i < N * logical_width; i++) {
F[i][REAL] = 0.0;
F[i][IMAG] = 0.0;
}
F[1][REAL] = 16.0; // Set mode k[0, 1]
fftw_execute(plan);
printTime(T, N); // Print time domain to console
IDFT 后信号的幅度似乎为 32。但是,我希望它是 16,因为唯一的贡献模式是 k[0, 1] = 16 + 0i。
为什么会这样?我应该在执行 IDFT 之前以某种方式转换信号吗?
【问题讨论】:
-
我不确定
printTime()是如何计算幅度的,但考虑到函数a * sin(x)产生的值介于-a和a之间,所以最大值和最小值之间的差是@987654331 @. -
printTime()不计算任何东西。它只打印四舍五入到小数点后 2 位的时域值。在这种情况下,最大值和最小值是 32 和 -32,即使输入的格式为16.0 * cos(x)。 -
在进行 fft 时,通常需要进行重新缩放或标准化。我以为是
N。所以我不太了解一些事情。看看thisfftw 文档