标签: fftw

实施Hann Window

我获取输入数据块并通过fftw传递它们以获得一些光谱信息.一切似乎都在起作用,但我认为我遇到了一些别名问题.

我一直在努力研究如何在我的数据块上实现一个hann窗口.谷歌让我失望的例子.我应该关注的任何想法或链接?

double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]
Run Code Online (Sandbox Code Playgroud)

更新

感谢Oli指出我实际上要解决的问题是光谱泄漏,而不是混叠...

c signal-processing fft fftw

7
推荐指数
3
解决办法
2万
查看次数

FFTW与OpenCV cvDFT

使用FFTW(http://www.fftw.org/)而不是OpenCV的cvDFT(http://goo.gl/YCHj0)时,我能指望加速吗?

我的程序的运行时间很大程度上取决于反向和正向DFT的应用,我正在考虑使用FFTW而不是OpenCV cvDFT.

IIRC FFTW执行某种"运行时编译",而cvDFT是一个简单的FFT实现,所以我想它可以加快我的处理速度.

所以在我自己尝试之前,我想在这里问一下,如果有人偶然发现了同样的问题并解决了它.

提前致谢

opencv runtime fftw dft

7
推荐指数
1
解决办法
4465
查看次数

CUFFT的缩放因子

我写了一个简单的测试程序,我正在做复杂到复杂的FT,我只生成了一些数据1..50并将其插入到数组的每个索引的实部和虚部.

当我做这样的操作IFFT(FFT(A))= A.

为了测试它们,我得到了每个库的不同结果.

FFTW,我必须将输出除以len(A)以取回原始A.

然而,执行此操作然后使用CUFFT反向FFT,看起来我必须除以(sqrt(2)*50)以返回原始数据.

这个额外的平方根因子来自哪里?

根据CUFFT文档:CUFFT执行非标准化FFT; 也就是说,对输入数据集执行前向FFT,然后对得到的集合进行逆FFT,产生的数据等于按元素数量缩放的输入.通过数据集的大小的倒数来缩放变换,留给用户按照看到的拟合执行.

提前致谢

c++ cuda fft fftw

6
推荐指数
2
解决办法
3061
查看次数

将音频样本从时域转换为频域

作为一名软件工程师,我在处理信号处理问题时遇到了一些困难.我在这个领域没有多少经验.

我尝试做的是采用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? …

audio signal-processing fft fftw audio-processing

6
推荐指数
1
解决办法
4141
查看次数

使用OpenMP创建FFTW计划

我试图并行执行几个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)

c++ openmp fftw parallax

6
推荐指数
1
解决办法
4282
查看次数

无法链接到fftw3库

我正在编译测试程序来测试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)

c linker linker-errors fftw

6
推荐指数
1
解决办法
1万
查看次数

使用 FFTW_MEASURE 时 FFT 输出为空,但使用 FFTW_ESTIMATE 时工作正常

我在尝试使用 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)

c++ fftw

6
推荐指数
1
解决办法
1108
查看次数

如何在Windows上使用FFTW ++?(对于傻瓜)

我正在使用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这就是我得到的,我完全迷失了.

我怎样才能编译它?如果你可以:尽可能详细地给我写一个关于如何使用这个东西的解释,我可能会愚蠢但我真的不知道发生了什么,我在谷歌上找不到任何教程.

c++ windows visual-studio fftw

6
推荐指数
1
解决办法
8053
查看次数

如何在 Julia 中可视化信号的 FFT?

我正在尝试在 Julia 中可视化一个信号及其频谱。

我找到了为频率提供 FFT 和DSPFFTW包。

这是我正在尝试的正弦信号:

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)

fft fftw julia

6
推荐指数
1
解决办法
6323
查看次数

使用 DFT 的一维热方程产生不正确的结果 (FFTW)

我正在尝试使用复杂到复杂的 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)

c++ fftw dft

6
推荐指数
1
解决办法
137
查看次数