我有一个关于fftw的任务,我正在尝试编写一个小程序来创建一个fft的图像.我正在使用CImg来读写图像.但我得到的只是一个带有一个白点的黑暗图像:(
我很可能以错误的方式做这件事,如果有人能解释如何做到这一点,我将不胜感激.我不需要代码,我只需要知道什么是正确的方法.
这是我的代码:
CImg<double> input("test3.bmp");
CImg<double> image_fft(input, false);
unsigned int nx = input.dimx(), ny = input.dimy();
size_t align = sizeof(Complex);
array2<Complex> in (nx, ny, align);
fft2d Forward(-1, in);
for (int i = 0; i < input.dimx(); ++i) {
for (int j = 0; j < input.dimy(); ++j) {
in(i,j) = input(i,j);
}
}
Forward.fft(in);
for (int i = 0; i < input.dimx(); ++i) {
for (int j = 0; j < input.dimy(); ++j) {
image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = …Run Code Online (Sandbox Code Playgroud) 我使用fftw库(fftw3.a,fftw3.lib)在Linux和Windows中编写了两个相同的程序,并计算fftwf_execute(m_wfpFFTplan)语句的持续时间(16-fft).
10000次运行:
我很困惑为什么在Windows上这比在Linux上快9倍.
处理器:Intel(R)Core(TM)i7 CPU 870 @ 2.93GHz
每个操作系统(Windows XP 32位和Linux OpenSUSE 11.4 32位)都安装在同一台计算机上.
我从互联网上下载了fftw.lib(适用于Windows)并且不知道配置.一旦我使用此配置构建FFTW:
/configure --enable-float --enable-threads --with-combined-threads --disable-fortran --with-slow-timer --enable-sse --enable-sse2 --enable-avx
Run Code Online (Sandbox Code Playgroud)
在Linux中,它产生的lib比默认配置(0.4 ms)快四倍.
我正在使用FFTW来分析高程数据,但我开始只是通过查看一个简单的1D fft来确保我的一切正常.它似乎工作除了归一化(规模)因素,我无法从文档中找出,主要是因为我的数字非常大.例如,当我试图只取一个余弦波的fft时
1 6.12323e-017 -1 -1.83697e-016 1 3.06162e-016 -1 -4.28626e-016 1 5.51091e-016 -1 -2.44991e-015 etc...
Run Code Online (Sandbox Code Playgroud)
我得到了转变
4.33743e-013 1.06036e+267 3.25205e+265 1.05963e+267 6.49675e+265 1.05743e+267 9.72679e+265 1.05379e+267 1.29349e+266 1.04869e+267 1.61138e+266 1.04216e+267 etc...
Run Code Online (Sandbox Code Playgroud)
例如,可笑的巨大数字.
任何帮助,将不胜感激.
在用scipy.fftpack.fft()对一些样本进行离散傅里叶变换并绘制这些样本的大小后,我注意到它不等于原始信号的幅度.这两者之间有关系吗?
有没有办法从傅里叶系数计算原始信号的幅度而不反转变换?
这是一个振幅为7.0,fft振幅为3.5的正弦波示例
from numpy import sin, linspace, pi
from pylab import plot, show, title, xlabel, ylabel, subplot
from scipy import fft, arange
def plotSpectrum(y,Fs):
"""
Plots a Single-Sided Amplitude Spectrum of y(t)
"""
n = len(y) # length of the signal
k = arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[range(n/2)] # one side frequency range
Y = fft(y)/n # fft computing and normalization
Y = Y[range(n/2)]
plot(frq,abs(Y),'r') # plotting the spectrum …Run Code Online (Sandbox Code Playgroud) 我正在做一些工作,比较一段时间内某些气体浓度的插值fft,其中不均匀采样,使用相同数据的lomb-scargle周期图.我正在使用scipy的fft函数来计算傅里叶变换,然后将其模数平方以得到我认为的功率谱密度,以十亿分之一(ppb)平方为单位.
我可以得到lomb-scargle图几乎与FFT的精确模式相匹配,但从不相同的幅度,FFT功率谱密度总是更高,即使我认为lomb-scargle功率是功率谱密度.现在我正在使用的lomb代码:http://www.astropython.org/snippet/2010/9/Fast-Lomb-Scargle-algorithm,将数据集标准化,取消平均值并除以数据方差的2倍,因此,我以相同的方式对FFT数据进行了归一化,但幅度仍然不匹配.
因此我做了一些更多的研究,发现标准化的坟墓疤痕能力可以无法完成,因此我不能将这些情节匹配.这引出了我的两个问题:
什么单位(如果有的话)是标准化的lim-scargle perioogram的功率谱密度?
在幅度和模式方面,我如何将我的fft情节与我的lomb-scargle情节相匹配?
谢谢.
我试图找到一个动态分配的数组的fft.使用输入数组从主机复制到设备cudaMemcpy2D.然后获取fft(cufftExecR2C)并将结果从设备复制回主机.
所以我最初的问题是如何在fft中使用音高信息.然后我在这里找到了答案 - CUFFT:如何计算投手指针的fft?
但不幸的是它不起作用.我得到的结果是垃圾值.以下是我的代码.
#define NRANK 2
#define BATCH 10
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cufft.h>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
const size_t NX = 4;
const size_t NY = 6;
int main()
{
// Input array (static) - host side
float h_in_data_static[NX][NY] ={
{0.7943 , 0.6020 , 0.7482 , 0.9133 , 0.9961 , 0.9261},
{0.3112 , 0.2630 , 0.4505 , 0.1524 , 0.0782 , 0.1782},
{0.5285 , 0.6541 , 0.0838 …Run Code Online (Sandbox Code Playgroud) 我试图理解FTT和卷积(互相关)理论,因此我创建了以下代码来理解它.代码是Matlab/Octave,但我也可以在Python中完成.
在1D:
x = [5 6 8 2 5];
y = [6 -1 3 5 1];
x1 = [x zeros(1,4)];
y1 = [y zeros(1,4)];
c1 = ifft(fft(x1).*fft(y1));
c2 = conv(x,y);
c1 = 30 31 57 47 87 47 33 27 5
c2 = 30 31 57 47 87 47 33 27 5
Run Code Online (Sandbox Code Playgroud)
在2D中:
X=[1 2 3;4 5 6; 7 8 9]
y=[-1 1];
conv1 = conv2(x,y)
conv1 =
24 53 89 29 21
96 140 197 65 42
168 227 …Run Code Online (Sandbox Code Playgroud) 我有两个图像I和J,我带X=fft(I)和Y=fft(J)有傅里叶变换,然后我分别采取"X"和"Y"的相位和幅度.
问题是我需要结合相位X和幅度Y来形成一个新的图像,并ifft用来重建这个新的图像,如何在MATLAB中做到这一点?
我正在尝试计算图像的FFT(快速傅立叶变换)以使用频率来确定图像是否模糊.
我需要使用我们的代码库中已有的自定义FFT算法.FFT算法需要标准的1D矢量doubles或ints.我需要一种方法来读取图像,然后将其转换为双精度矢量,以便我可以计算图像的FFT.
我尝试过以下方法:
cv::Mat inputImage = cv::imread("testImage.png");
cv::Mat fImage;
inputImage.convertTo(fImage, CV_32F);
std::vector<double> actualImage = fImage.clone();
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误:
OpenCV错误:copyTo中的断言失败(channels()== CV_MAT_CN(dtype)),
有关如何实现这一目标的任何想法?
以下C#NAudio代码与MATLAB产生的结果相差4倍。为什么会发生这种情况,其中之一是不正确的吗?
Complex[] tmp = new Complex[4];
tmp[0].X = 1.0f;
tmp[1].X = 0.5f;
tmp[2].X = 1.0f;
tmp[3].X = 0.25f;
tmp[0].Y = 0.0f;
tmp[1].Y = 0.0f;
tmp[2].Y = 0.0f;
tmp[3].Y = 0.0f;
FastFourierTransform.FFT(true, 2, tmp);
Run Code Online (Sandbox Code Playgroud)
NAUDIO输出:
0.6875 + 0.0000i
0.0000 - 0.0625i
0.3125 + 0.0000i
0.0000 + 0.0625i
Run Code Online (Sandbox Code Playgroud)
MATLAB输出:
2.7500 + 0.0000i
0.0000 - 0.2500i
1.2500 + 0.0000i
0.0000 + 0.2500i
Run Code Online (Sandbox Code Playgroud)