作为一名软件工程师,我在处理信号处理问题时遇到了一些困难.我在这个领域没有多少经验.
我尝试做的是采用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? …
我正在编译测试程序来测试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) 我正在使用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) 我正在尝试使用 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) 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)
我希望加速计算机视觉应用程序,在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.0ms上Intel 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) 我目前正在实施在 C++ 中使用四元数 FFT 的研究论文。但是,我找不到任何支持四元数 FFT 的 C++ 库。经过一些调查,我发现网上有人说可以将四元数FFT过程转换为几个一维复数到复数的FFT。有谁知道这是怎么做到的吗?
我尝试使用支持一些基本 FFT 方法的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)