我获取输入数据块并通过fftw传递它们以获得一些光谱信息.一切似乎都在起作用,但我认为我遇到了一些别名问题.
我一直在努力研究如何在我的数据块上实现一个hann窗口.谷歌让我失望的例子.我应该关注的任何想法或链接?
double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]
Run Code Online (Sandbox Code Playgroud)
更新
感谢Oli指出我实际上要解决的问题是光谱泄漏,而不是混叠...
使用FFTW(http://www.fftw.org/)而不是OpenCV的cvDFT(http://goo.gl/YCHj0)时,我能指望加速吗?
我的程序的运行时间很大程度上取决于反向和正向DFT的应用,我正在考虑使用FFTW而不是OpenCV cvDFT.
IIRC FFTW执行某种"运行时编译",而cvDFT是一个简单的FFT实现,所以我想它可以加快我的处理速度.
所以在我自己尝试之前,我想在这里问一下,如果有人偶然发现了同样的问题并解决了它.
提前致谢
我写了一个简单的测试程序,我正在做复杂到复杂的FT,我只生成了一些数据1..50并将其插入到数组的每个索引的实部和虚部.
当我做这样的操作IFFT(FFT(A))= A.
为了测试它们,我得到了每个库的不同结果.
FFTW,我必须将输出除以len(A)以取回原始A.
然而,执行此操作然后使用CUFFT反向FFT,看起来我必须除以(sqrt(2)*50)以返回原始数据.
这个额外的平方根因子来自哪里?
根据CUFFT文档:CUFFT执行非标准化FFT; 也就是说,对输入数据集执行前向FFT,然后对得到的集合进行逆FFT,产生的数据等于按元素数量缩放的输入.通过数据集的大小的倒数来缩放变换,留给用户按照看到的拟合执行.
提前致谢
作为一名软件工程师,我在处理信号处理问题时遇到了一些困难.我在这个领域没有多少经验.
我尝试做的是采用44100采样率对环境声音进行采样,并对固定尺寸的窗口进行采样,以测试是否存在特定频率(20KHz)且高于阈值.
根据如何使用C中的FFTW从PortAudio中提取样本中的频率信息,我将按照完美的答案执行此操作
从音频端口收集102400个样本(2320 ms),采样率为44100.样本值介于0.0和1.0之间
int samplingRate = 44100;
int numberOfSamples = 102400;
float samples[numberOfSamples] = ListenMic_Function(numberOfSamples,samplingRate);
Run Code Online (Sandbox Code Playgroud)
窗口大小或FFT大小为1024个样本(23.2 ms)
int N = 1024;
Run Code Online (Sandbox Code Playgroud)
窗口数是100
int noOfWindows = numberOfSamples / N;
Run Code Online (Sandbox Code Playgroud)
将样本拆分到noOfWindows(100)窗口,每个窗口的大小为N(1024)个样本
float windowSamplesIn[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesIn[i] = subarray(samples,i*N,(i+1)*N);
endfor
Run Code Online (Sandbox Code Playgroud)
在每个窗口上应用汉宁窗函数
float windowSamplesOut[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesOut[i] = HanningWindow_Function(windowSamplesIn[i]);
endfor
Run Code Online (Sandbox Code Playgroud)
在每个窗口上应用FFT(在FFT函数内完成复数转换)
float frequencyData[noOfWindows][samplingRate/2];
for i:= 0 to noOfWindows -1
frequencyData[i] = RealToComplex_FFT_Function(windowSamplesOut[i], samplingRate);
endfor
Run Code Online (Sandbox Code Playgroud)
在最后一步中,我使用此链接中实现的FFT函数:http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm ; 因为我无法从头开始实现FFT功能.
我不能确定的是,当给FFT输入N(1024)个样本时,samplingRate/2(22050)分贝值作为输出返回.这是一个FFT功能吗?
据我所知,由于奈奎斯特频率,我最多可以检测到一半的采样率频率.但是,每个频率的分贝值是否可以达到samplingRate/2(22050)Hz? …
我试图并行执行几个FFT.我正在使用FFTW和OpenMP.每个FFT都不同,所以我不依赖于FFTW的内置多线程(我知道使用OpenMP).
int m;
// assume:
// int numberOfColumns = 100;
// int numberOfRows = 100;
#pragma omp parallel for default(none) private(m) shared(numberOfColumns, numberOfRows)// num_threads(4)
for(m = 0; m < 36; m++){
// create pointers
double *inputTest;
fftw_complex *outputTest;
fftw_plan testPlan;
// preallocate vectors for FFTW
outputTest = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfRows*numberOfColumns);
inputTest = (double *)fftw_malloc(sizeof(double)*numberOfRows*numberOfColumns);
// confirm that preallocation worked
if (inputTest == NULL || outputTest == NULL){
logger_.log_error("\t\t FFTW memory not allocated on m = %i", m);
}
// EDIT: insert data …Run Code Online (Sandbox Code Playgroud) 我正在编译测试程序来测试fftw3(ver3.3.4).由于它没有安装root previlidge,我使用的命令是:
gcc -lm -L/home/my_name/opt/fftw-3.3.4/lib/ -I/home/my_name/opt/fftw-3.3.4/include/ fftwtest.c
Run Code Online (Sandbox Code Playgroud)
安装库的位置
/home/my_name/opt/fftw-3.3.4/
Run Code Online (Sandbox Code Playgroud)
我的代码是fftw3网站上的第一个教程:
#include <stdio.h>
#include <fftw3.h>
int main(){
int n = 10;
fftw_complex *in, *out;
fftw_plan p;
in = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex));
out = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex));
p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed */
fftw_destroy_plan(p);
fftw_free(in); fftw_free(out);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译程序时它会返回以下错误:
/tmp/ccFsDL1n.o: In function `main':
fftwtest.c:(.text+0x1d): undefined reference to `fftw_malloc'
fftwtest.c:(.text+0x32): undefined reference to `fftw_malloc'
fftwtest.c:(.text+0x56): undefined reference to `fftw_plan_dft_1d'
fftwtest.c:(.text+0x66): undefined reference to `fftw_execute'
fftwtest.c:(.text+0x72): undefined reference …Run Code Online (Sandbox Code Playgroud) 我在尝试使用 fftw3 时遇到以下问题。由于某种原因,每当我使用 FFTW_MEASURE 而不是 FFTW_ESTIMATE 进行 FFT 时,我都会得到空白输出。最终我试图实现 fft 卷积,因此下面的示例包括 FFT 和逆 FFT。
显然我错过了一些东西......有人能教育我吗?谢谢你!
我使用的是 Linux (OpenSUSE Leap 42.1),使用包管理器中提供的 fftw3 版本。
最小工作示例:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <fftw3.h>
using namespace std;
int main(int argc, char ** argv)
{
int width = 10;
int height = 8;
cout.setf(ios::fixed|ios::showpoint);
cout << setprecision(2);
double * inp = (double *) fftw_malloc(sizeof(double) * width * height);
fftw_complex * cplx = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * height * (width/2 + 1));
for(int i = 0; …Run Code Online (Sandbox Code Playgroud) 我正在使用Windows 10和Visual Studio 2015.在C++中,我需要对图像进行傅立叶变换以对其应用滤镜.似乎FFTW ++是理想的解决方案,但我不能让它编译,它让我疯了.我对编程比较陌生,所以我不知道这有多尴尬.
我在Visual Studio中使用NuGet函数来获取FFTW库.由于我在NuGet上找不到它,我从以下链接下载了FFTW +东西:https://sourceforge.net/projects/fftwpp/ 我将下载的内容复制到项目文件夹,并将头文件包含在解决方案探索者.但它没有编译,抛出了许多奇怪的错误(例如:在seconds.h中,它表示某些获取时区的函数已经过时,并且在fftww ++中.h它表示std :: max是非法的) .
因此,在看到这不起作用后,我回到了FFTW网站,并尝试使用Windows安装指南.http://www.fftw.org/install/windows.html 我下载了64位版本,我完全不知道如何进行库导入,甚至不知道如何做.i.imgur.com/Qs7mFQT.png这就是我得到的,我完全迷失了.
我怎样才能编译它?如果你可以:尽可能详细地给我写一个关于如何使用这个东西的解释,我可能会愚蠢但我真的不知道发生了什么,我在谷歌上找不到任何教程.
我正在尝试在 Julia 中可视化一个信号及其频谱。
这是我正在尝试的正弦信号:
using Plots
using FFTW
using DSP
# Number of points
N = 2^14 - 1
# Sample rate
fs = 1 / (1.1 * N)
# Start time
t0 = 0
tmax = t0 + N * fs
# time coordinate
t = [t0:fs:tmax;]
# signal
signal = sin.(2? * 60 * t) # sin (2? f t)
# Fourier Transform of it
F = fft(signal)
freqs = fftfreq(length(t), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用复杂到复杂的 IDFT 来求解一维热方程。问题是单个时间步长后的输出似乎不正确。我在下面包含了一个简单的例子来说明这个问题。
频域中的初始模式为:
k[ 0] = 12.5 + 0i
k[ 1] = 12.5 + 0i
k[ 2] = 12.5 + 0i
k[ 3] = 12.5 + 0i
k[ 4] = 12.5 + 0i
k[-3] = 12.5 + 0i
k[-2] = 12.5 + 0i
k[-1] = 12.5 + 0i
然后我将频域的状态推进到t=0.02使用标准的一维热方程:
double alpha = 0.2; // Thermal conductivity constant
double timestep = 0.02;
for (int i = 0; i < N; i++) {
int k = (i <= …Run Code Online (Sandbox Code Playgroud)