- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上周我一直在用 FFTW 编程一些二维卷积,方法是将两个信号传递到频域,相乘,然后返回。
令人惊讶的是,只有当输入大小小于固定数字时,我才能得到正确的结果!
我发布了一些工作代码,其中我采用简单的初始常数矩阵,其值为 2 作为输入,1 作为空间域上的过滤器。这样,对它们进行卷积的结果应该是第一个矩阵值的平均值的矩阵,即 2,因为它是常数。这是我将宽度和高度的大小分别从 0 更改为 h=215、w=215 时的输出;如果我设置 h=216、w=216 或更大,那么输出就会损坏!!我真的很感激一些关于我可能在哪里犯错的线索。非常感谢!
#include <fftw3.h>
int main(int argc, char* argv[]) {
int h=215, w=215;
//Input and 1 filter are declared and initialized here
float *in = (float*) fftwf_malloc(sizeof(float)*w*h);
float *identity = (float*) fftwf_malloc(sizeof(float)*w*h);
for(int i=0;i<w*h;i++){
in[i]=5;
identity[i]=1;
}
//Declare two forward plans and one backward
fftwf_plan plan1, plan2, plan3;
//Allocate for complex output of both transforms
fftwf_complex *inTrans = (fftwf_complex*) fftw_malloc(sizeof(fftwf_complex)*h*(w/2+1));
fftwf_complex *identityTrans = (fftwf_complex*) fftw_malloc(sizeof(fftwf_complex)*h*(w/2+1));
//Initialize forward plans
plan1 = fftwf_plan_dft_r2c_2d(h, w, in, inTrans, FFTW_ESTIMATE);
plan2 = fftwf_plan_dft_r2c_2d(h, w, identity, identityTrans, FFTW_ESTIMATE);
//Execute them
fftwf_execute(plan1);
fftwf_execute(plan2);
//Multiply in frequency domain. Theoretically, no need to multiply imaginary parts; since signals are real and symmetric
//their transform are also real, identityTrans[i][i] = 0, but i leave here this for more generic implementation.
for(int i=0; i<(w/2+1)*h; i++){
inTrans[i][0] = inTrans[i][0]*identityTrans[i][0] - inTrans[i][1]*identityTrans[i][1];
inTrans[i][1] = inTrans[i][0]*identityTrans[i][1] + inTrans[i][1]*identityTrans[i][0];
}
//Execute inverse transform, store result in identity, where identity filter lied.
plan3 = fftwf_plan_dft_c2r_2d(h, w, inTrans, identity, FFTW_ESTIMATE);
fftwf_execute(plan3);
//Output first results of convolution(in, identity) to see if they are the average of in.
for(int i=0;i<h/h+4;i++){
for(int j=0;j<w/w+4;j++){
std::cout<<"After convolution, component (" << i <<","<< j << ") is " << identity[j+i*w]/(w*h*w*h) << endl;
}
}std::cout<<endl;
//Compute average of data
float sum=0.0;
for(int i=0; i<w*h;i++)
sum+=in[i];
std::cout<<"Mean of input was " << (float)sum/(w*h) << endl;
std::cout<< endl;
fftwf_destroy_plan(plan1);
fftwf_destroy_plan(plan2);
fftwf_destroy_plan(plan3);
return 0;
}
最佳答案
您的问题与 fftw 无关!它来自这一行:
std::cout<<"After convolution, component (" << i <<","<< j << ") is " << identity[j+i*w]/(w*h*w*h) << endl;
如果 w=216
和 h=216
那么 `w*h*w*h=2 176 782 336。有符号 32 位整数的上限是 2 147 483 647.你正面临溢出...
解决方案是将分母转换为float
。
std::cout<<"After convolution, component (" << i <<","<< j << ") is " << identity[j+i*w]/(((float)w)*h*w*h) << endl;
下一个你要面对的麻烦是这个:
float sum=0.0;
for(int i=0; i<w*h;i++)
sum+=in[i];
请记住,float
有 7 个有用的十进制数字。如果 w=h=4000
,计算出的平均值将低于真实值。使用 double
或编写两个循环并在内循环 (localsum
) 上求和,然后再对外循环 (sum+=localsum
) 求和!
再见,
弗朗西斯
关于fftw - fftw 输出取决于输入的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195814/
上周我一直在用 FFTW 编程一些二维卷积,方法是将两个信号传递到频域,相乘,然后返回。 令人惊讶的是,只有当输入大小小于固定数字时,我才能得到正确的结果! 我发布了一些工作代码,其中我采用简单的初始
有没有办法检查 - 凋零 FFTW 是以单精度还是 double 编译的? 最佳答案 如果库的名称以 f 为后缀,则为单精度。否则就是双标。例如, libfftw3.a 是 double libfft
我正在学习如何使用 Fortran 处理 FFTW 包。为了生成一个易于验证的示例,我计算了一个二维平面的功率谱,我用两个不同的叠加波填充它。这样,我就可以确切地知道功率谱中的峰值在哪里。 由于 FF
我需要使用具有不同算术精度和多线程计划的 FFTW。 我需要为所有精度设置多线程?像这样: fftwf_init_threads(); fftwf_plan_with_nthreads(nthread
我正在尝试在 C 中使用 fftw3.3.5 进行 DFT。但是我目前在将 DFT 应用于实际数据时遇到了麻烦,它会导致一些奇怪的结果,比如极大的数字,以及不对称的东西。 这是测试代码: #inclu
我正在使用 FFTW 来计算二维复数数据的逆 DFT。默认设置(复数到复数)的输出是复数,虚部不为零。但是,我只对结果的实部感兴趣,而不对复数部分感兴趣。 FFTW 的交错实数复数输出对我来说并不理想
我在程序中使用 FFTW3 对 2D 数组(大约 3k x 3k,复杂数据类型)进行一些处理。 该计划最激烈的部分基本上是这样做的: Break the array up into N threads
我正在读取一个原始声音文件,并尝试对其运行 fft,目的是在最后获取 PSD,但我在开始时收到了一个错误,我可以'不太明白,希望在这里得到一些帮助,代码是: #include #include i
我使用以下代码来执行复数数组的 COMPLEX IFFT(我必须获得复数结果): #include #include #include #include #include #include
我正在努力为 FFTW 操作实现更好的性能。出于这个原因,我决定使用智慧文件来创建计划,但问题是它无法从智慧文件中加载计划(导出智慧效果很好)。我试图将智慧导出到一个文件,并在下一个程序运行时将其加载
我想在线程中使用 fftw3。但是代码粘贴在http://codepad.org/lIjdGF5z导致“double free or corruption”错误。如何正确调用线程中的 fftw3 例程
我的最终目标是从单声道波形文件中提取所有低于 15KHz 的声音信息。该程序将样本加载到内存中,并将其表示为 16 位有符号整数数组。 我用的是FFTW,它有复数多维fft、实数多维fft、实数一维f
我正在尝试在拆分数组上使用 fftw (3.3.4)。我从 C/MEX 指南 (PDF: http://www.researchgate.net/publictopics.PublicPostFile
我安装了一个新系统和上面的所有库。但是,我对 fftw 有疑问。 cmake 命令后出现以下错误 CMake Error at /usr/share/cmake/Modules/FindPackage
我正试图让 FFTW 在 C 中工作。它曾经为另一个项目(在 JNI 中)工作,我或多或少地从那个项目中复制代码,遗憾的是没有结果。 首先我生成一个正弦信号,如下所示: double* generat
我正在尝试使用 FFTW 库计算 53k 双样本的 FFT,并在此基础上猜测信号的基频是多少。样本由sndfile库在wav输入文件的基础上生成(程序加载wav文件,生成double数据的样本并保存到
我对信号处理还很陌生,所以请原谅我的吐槽。我已经下载并安装了适用于 Windows 的 FFTW。文档没问题,但我仍有疑问。 我的总体目标是从计算机上的声卡捕获以 44100 采样/秒采样的原始音频数
我正在使用 FFTW 的线程版本(一个 FFT 库)来尝试加速双 CPU 机器上的一些代码。这是只有 1 个线程的时间输出: 131.838u 1.979s 2:13.91 99.9% 这里有 2 个
我想知道是否可以存储来自 FFTW 的一维 FFT 调用的转置矩阵。考虑我的矩阵 nrows_1 x w_size。目前它存储在大小为 w_size 的 block 中 for (ix = 0 ; i
我实现了一个 fftw (fftw.org) 示例来使用快速傅立叶变换...这是代码.... 我加载了一张我从 uint8_t 转换为 double 的图像(此代码工作正常...)。 string b
我是一名优秀的程序员,十分优秀!