【发布时间】:2017-06-23 03:15:36
【问题描述】:
我正在尝试使用 FFTW 在 C 中生成 2d 粉红噪声 (1/f) 图像
fftw_complex * Xf = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nrows*ncolumns);
fftw_plan ift = fftw_plan_dft_c2r_2d(nrows,ncolumns,Xf,image,FFTW_BACKWARD|FFTW_ESTIMATE);
for (int rr=0; rr<nrows; rr++) {
for (int cc=0; cc<ncolumns; cc++) {
if (rr<=nrows/2) {
u = 1.0*rr/nrows;
}
else {
u = 1.0*(rr-nrows)/nrows;
}
if (cc<=ncolumns/2) {
v = 1.0*cc/ncolumns;
}
else {
v = 1.0*(cc-ncolumns)/ncolumns;
}
// 1/f power spectrum
w = pow(u,2)+pow(v,2);
if (w!=0) {
Sf = pow(w,-1/2);
}
else {
Sf = 0;
}
// random phase
phi = 1.0*rand()/RAND_MAX;
// complex spectrum
Xf[rr+nrows*cc][0] = sqrt(Sf) * cos(2*pi*phi);
Xf[rr+nrows*cc][1] = sqrt(Sf) * sin(2*pi*phi);
}
}
fftw_execute(ift);
当我在 matlab 中使用相同的光谱 (real(ifft2(...)) 进行逆傅立叶变换时,我得到了一个典型的粉红噪声图像(左下)。但是 FFTW 返回的图像不是粉红色的噪音(右):example of pink noise images。 如果我尝试制造棕色噪音 (1/f2),我会得到更糟糕的结果:example and brown noise images。 有人知道为什么我没有从 FFTW 傅立叶逆变换得到正确的图像吗?我在 matlab 中得到的图像是正确的,所以光谱似乎不是问题。
【问题讨论】: