标签: fftw

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

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

我尝试做的是采用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
查看次数

无法链接到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万
查看次数

如何在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
查看次数

如何在 Python 线程池中使用初始化器

我正在尝试使用 PyFFTW 进行线程卷积,以便同时计算大量的 2D 卷积。(不需要单独的进程,因为 GIL 是为 Numpy 操作而释放的)。现在这是这样做的规范模型: http ://code.activestate.com/recipes/577187-python-thread-pool/

(Py)FFTW 之所以如此快,是因为它重用了计划。必须为每个线程单独设置这些以避免访问冲突错误,如下所示:

class Worker(Thread):
    """Thread executing tasks from a given tasks queue"""
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True

        # Make separate fftw plans for each thread.
        flag_for_fftw='patient'      
        self.inputa = np.zeros(someshape, dtype='float32')
        self.outputa = np.zeros(someshape_semi, dtype='complex64')

        # create a forward plan.
        self.fft = fftw3.Plan(self.inputa,self.outputa, direction='forward', flags=[flag_for_fftw],nthreads=1)         

        # Initialize the arrays for the inverse fft.
        self.inputb = np.zeros(someshape_semi, dtype='complex64')
        self.outputb = np.zeros(someshape, dtype='float32')

        # Create the backward …
Run Code Online (Sandbox Code Playgroud)

python multithreading convolution fftw

5
推荐指数
1
解决办法
2159
查看次数

FFT 和逆 FFT 之间有什么实际区别吗?

FFT 库(例如 FFTW 或 numpy.fft)通常提供两个函数fft()ifft()(及其用于实值输入的特殊版本)。这些函数的定义似乎是这样的

ifft(fft(X)) == X
Run Code Online (Sandbox Code Playgroud)

fft(X) == constant_factor * reverse(ifft(X))
Run Code Online (Sandbox Code Playgroud)

在复杂输入之间进行选择ifft()和操作时,是否有任何实际或技术原因需要考虑?虽然(信号、时域或空间域)和(频谱、频域)fft()的解释不同,但它在计算上重要吗?Xfft(X)

fft fftw

5
推荐指数
1
解决办法
6226
查看次数

为什么cuFFT这么慢?

我希望加速计算机视觉应用程序,在Intel CPU上使用FFTW和OpenMP计算许多FFT.但是,对于各种FFT问题大小,我发现cuFFT比使用OpenMP的FFTW慢.

在下面的实验和讨论中,我发现对于批量2D FFT ,cuFFT 比FFTW .为什么cuFFT这么慢,有什么办法让cuFFT运行得更快?


实验(代码下载)

我们的计算机视觉应用需要在一堆256x256的小型平面上进行正向FFT.我在HOG功能上运行FFT,深度为32,因此我使用批处理模式为每个函数调用执行32次FFT.通常,我做大约8个大小为256x256的FFT函数调用,批量大小为32.

FFTW + OpenMP的
下面的代码执行在16.0msIntel i7-2600 8-core CPU.

int depth = 32; int nRows = 256; int nCols = 256; int nIter = 8;
int n[2] = {nRows, nCols};

//if nCols is even, cols_padded = (nCols+2). if nCols is odd, cols_padded = (nCols+1)
int cols_padded = 2*(nCols/2 + 1); //allocate this width, but tell FFTW that it's nCols width
int …
Run Code Online (Sandbox Code Playgroud)

cuda gpu fft computer-vision fftw

5
推荐指数
1
解决办法
5741
查看次数

在 C++ 中使用一维 FFT 的四元数 FFT

我目前正在实施在 C++ 中使用四元数 FFT 的研究论文。但是,我找不到任何支持四元数 FFT 的 C++ 库。经过一些调查,我发现网上有人说可以将四元数FFT过程转换为几个一维复数到复数的FFT。有谁知道这是怎么做到的吗?

我尝试使用支持一些基本 FFT 方法的FFTW++库来实现它。如果有人可以提供帮助,我将不胜感激。

c++ fft quaternions fftw

5
推荐指数
1
解决办法
761
查看次数

如何更改 fftw 计划(执行)数组大小?

我需要你的帮助。

我在我的主 cpp 中定义了数组和计划。然后,我将数据放入数组中,并在我的子 cpp 中执行 fftw。sub cpp 在线程中,即循环。

我定义了足够的数组大小,因为数据的数量是动态的。但 fftw 正在对数组的整个大小进行 fft,因此在我的情况下结果不正确。因为数据的数量总是小于数组的大小。

在 sub cpp 中定义数组是解决问题的简单方法,但我不想在 sub cpp 中定义数组,因为 sub cpp 是循环的。

我只想定义一次数组并独立于数组大小更改 fft 窗口大小。

我能怎么做?

/////// in my main cpp //////
fft_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nScanSize);
fft_out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nScanSize);
p = fftw_plan_dft_1d(nScanSize, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);
/////////////////////////////

/////// in my sub cpp -> looped ///////
for (i = 0; i < nChannelCountAI; i++) {

    for (j = nFirstIndex; j < nLastIndex; j++) {
        fft_in[j - nFirstIndex][0] = RawData[i][j];
        fft_in[j - …
Run Code Online (Sandbox Code Playgroud)

c++ fftw

5
推荐指数
0
解决办法
471
查看次数