标签: fft

安全快速的FFT

灵感来自Herb Sutter引人注目的讲座不是你父亲的C++,我决定再使用微软的Visual Studio 2010来看看最新版本的C++.我特别感兴趣的是Herb断言C++"安全而快速",因为我写了很多性能关键代码.

作为基准,我决定尝试用各种语言编写相同的简单FFT算法.

我想出了以下使用内置complex类型和vector集合的C++ 11代码:

#include <complex>
#include <vector>

using namespace std;

// Must provide type or MSVC++ barfs with "ambiguous call to overloaded function"
double pi = 4 * atan(1.0);

void fft(int sign, vector<complex<double>> &zs) {
    unsigned int j=0;
    // Warning about signed vs unsigned comparison
    for(unsigned int i=0; i<zs.size()-1; ++i) {
        if (i < j) {
            auto t = zs.at(i);
            zs.at(i) = zs.at(j);
            zs.at(j) = t;
        }
        int m=zs.size()/2;
        j^=m; …
Run Code Online (Sandbox Code Playgroud)

c++ performance fft c++11

14
推荐指数
1
解决办法
8365
查看次数

如何使用Swift在iOS中捕获音频样本?

我在网上找到了许多用于在iOS中处理音频的例子,但是大多数都已经过时了,并不适用于我想要完成的任务.这是我的项目:

我需要从两个来源捕获音频样本 - 麦克风输入和存储的音频文件.我需要对这些样本执行FFT以产生整个剪辑的"指纹",以及应用一些额外的过滤器.最终目标是构建一种类似于Shazam等的歌曲识别软件.

在iOS 8中捕获单个音频样本以执行快速傅里叶变换的最佳方法是什么?我想最终会有大量的这些,但我怀疑它可能不会像那样.其次,如何使用Accelerate框架处理音频?它似乎是在iOS中对音频执行复杂分析的最有效方式.

我在网上看到的所有例子都使用旧版本的iOS和Objective-C,但我无法将它们成功转换为Swift.iOS 8是否为这类东西提供了一些新的框架?

audio signal-processing fft ios swift

14
推荐指数
2
解决办法
4917
查看次数

使用Java中的傅立叶变换处理音频数据

我正在尝试处理音频数据.我正在使用Java.我已将音频数据提取到数组中.现在我应该将N个数据样本传递给计算离散傅里叶变换(或快速傅里叶变换,这样更有效)的函数.我读过文档,但是我越来越困惑了.我想要计算的是幅度谱(| X(k)|).谁能帮我?谢谢

java audio fft wav

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

来自jTransforms DoubleFFT_1D的功率谱密度

我正在使用Jtransforms java库对给定的数据集执行分析.

数据的一个例子如下:

980,988,1160,1080,928,1068,1156,1152,1176,1264
Run Code Online (Sandbox Code Playgroud)

我在jTransforms中使用DoubleFFT_1D函数.数据输出如下:

10952, -152, 80.052, 379.936, -307.691, 12.734, -224.052, 427.607, -48.308, 81.472
Run Code Online (Sandbox Code Playgroud)

我在解释输出时遇到了麻烦.据我所知,输出数组中的第一个元素是10个输入(10952)的总和.它的

我不理解的输出数组的其他元素.最后,我想在图表上绘制输入数据的功率谱密度,并找到介于0和.5 Hz之间的量.

jTransform函数的文档说明(其中a是数据集):

public void realForward(double[] a)计算实数据的1D前向DFT,结果为a.输出数据的物理布局如下:

如果n是那么

a[2*k] = Re[k], 0 <= k < n / 2
a[2*k+1] = Im[k], 0 < k < n / 2
a[1] = Re[n/2]
Run Code Online (Sandbox Code Playgroud)

如果n是奇数那么

a[2*k] = Re[k], 0 <= k < (n+1)/2
a[2*k+1] = Im[k], 0 < k< (n-1)/2
a[1] = Im[(n-1)/2]
Run Code Online (Sandbox Code Playgroud)

此方法仅计算实数变换的一半元素.另一半满足对称条件.如果您想要完全真正的正向变换,请使用realForwardFull.要获取原始数据,请在此方法的输出上使用realInverse.

参数:a - 要转换的数据

现在使用上面的方法:(因为我的数据数组的长度是10,所以使用"n是偶数"方法)

Re[0] = 10952
Re[1] = 80.052
Re[2] = …
Run Code Online (Sandbox Code Playgroud)

fft spectral-density

13
推荐指数
1
解决办法
7989
查看次数

Java中最近的FFTW包装器

我正在为最新版本的FFTW寻找一个最小的Java包装器.在FFTW网站上列出的包装器要么过时(jfftw-1.2.zip),要么包含太多额外的东西(Shared Scientific Toolbox).谷歌搜索建议JFFTW3看起来很有前景,但下载链接已经破了(有人有镜子吗?)

对于那些想要纯Java FFT库的人来说,JTransforms看起来非常好.我更喜欢使用FFTW,因为它大约快两倍,它处理任意尺寸d> 3.

java scala fft wrapper fftw

13
推荐指数
1
解决办法
3899
查看次数

Matlab和numpy/scipy中的FFT给出不同的结果

我正在尝试重新实现其中一个matlab工具箱.他们在那边使用fft.当我对相同的数据执行相同的操作时,我会得到与matlab不同的结果.看看:

MATLAB:

Msig =

 0     0     0     0
 0     0     0     0
 0     0     0     0
 0     0     0     0
 0     1     0     0
 0     0     0     0

fft(Msig.')

Columns 1 through 4

    0                  0                  0                  0          
    0                  0                  0                  0          
    0                  0                  0                  0          
    0                  0                  0                  0          

Columns 5 through 6

 1.0000                  0          
      0 - 1.0000i        0          
-1.0000                  0          
      0 + 1.0000i        0    
Run Code Online (Sandbox Code Playgroud)

PYTHON:

Msig=
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ …
Run Code Online (Sandbox Code Playgroud)

python matlab numpy fft scipy

13
推荐指数
1
解决办法
6471
查看次数

使用IOS Accelerate Framework在非二次幂图像上进行二维信号处理?

//编辑...

我正在编辑我的问题,以解决专门处理非二次幂图像的问题.我有一个基本结构,适用于尺寸为256x256或1024x1024的方形灰度图像,但无法看到如何推广到任意大小的图像.fft函数似乎希望你包含宽度和高度的log2,但是它不清楚如何解压缩结果数据,或者数据是否只是被扰乱.我认为显而易见的事情是将npot图像置于较大的全黑图像中,然后在查看数据时忽略这些位置中的任何值.但是想知道是否有一种不太笨拙的方法来处理npot数据.

//...END编辑

我在使用Accelerate Framework文档时遇到了一些麻烦.我通常会使用FFTW3,但是我无法在实际的IOS设备上进行编译(请参阅此问题).任何人都可以指向使用Accelerate的超级简单实现,它执行如下操作:

1)将图像数据转换为适当的数据结构,可以传递给Accelerate的FFT方法.
在FFTW3中,最简单的是,使用灰度图像,这涉及将无符号字节放入"fftw_complex"数组中,该数组只是两个浮点数的结构,一个包含实数值,另一个包含虚数(和虚数在哪里)每个像素初始化为零).

2)采用该数据结构并对其执行FFT.

3)打印出幅度和相位.

4)对其执行IFFT.

5)根据IFFT产生的数据重新创建原始图像.

虽然这是一个非常基本的例子,但我在使用Apple网站上的文档时遇到了麻烦.Pi的SO 答案非常有用,但我仍然对如何使用Accelerate使用灰度(或彩色)2D图像执行此基本功能感到困惑.

无论如何,任何指针或特别是一些处理2D图像的简单工作代码都会非常有用!

编辑\\\

好的,花了一些时间深入研究文档和SO上的一些非常有用的代码以及pkmital的github repo,我有一些工作代码,我以为我会发布自1)我花了一段时间来计算它和2)因为我有几个剩下的问题......

初始化FFT"计划".假设一个方形的二次幂图像:

#include <Accelerate/Accelerate.h>
...
UInt32 N = log2(length*length);
UInt32 log2nr = N / 2; 
UInt32 log2nc = N / 2;
UInt32 numElements = 1 << ( log2nr + log2nc );
float SCALE = 1.0/numElements;
SInt32 rowStride = 1; 
SInt32 columnStride = 0;
FFTSetup setup = create_fftsetup(MAX(log2nr, log2nc), FFT_RADIX2);
Run Code Online (Sandbox Code Playgroud)

传入一个字节数组,用于方形二次灰度图像并将其转换为COMPLEX_SPLIT:

COMPLEX_SPLIT in_fft;
in_fft.realp = ( float* ) …
Run Code Online (Sandbox Code Playgroud)

signal-processing fft ios vdsp

13
推荐指数
1
解决办法
1872
查看次数

在iPhone上播放歌曲时通过麦克风检测噪音

我正在制作一个应该播放简单音轨的应用程序,让我知道在播放曲目时附近是否有噪音.这是通过在iPhone的扬声器上播放歌曲时从麦克风进行实时录制来完成的.任何不属于音乐播放的声音都被定义为噪音.

实现此功能的最简单方法是什么?

我在网上进行了相当广泛的研究,但是我找不到任何能指出这个特定问题的解决方案的东西.虽然它可能是我阅读的不同技术的组合,但最终将成为解决方案.

我已经实现的东西
同时播放歌曲和录制音频.

我尝试过的事情
注意:由于我们鼓励我们添加我们已尝试的内容,因此我添加以下部分.但我绝不是说这是解决问题的正确方法,这只是我尝试过的事情.

我攻击了aurioTouch2示例应用程序:我所做的是回放一次歌曲并记录快速傅立叶变换值(以非常低的采样率保持记录数据的数量较低).然后,当再次播放曲目时,我基本上计算(每个时间步长)使用实时回放fft数据构建的输出图形与记录的fft数据之间的相关系数(所以当你放置时看到的'波浪'线条)应用于fft模式).
这种"有点"有效.当房间内有过多的声音/噪音时,相关系数明显较低,但它不是非常敏感,也取决于记录fft数据时使用的音量.最后,我认为这可能不是最好的方法.

有人认为这是可能的吗?如果是这样,最好的方法是什么?
请询问您是否需要更多说明!

iphone audio fft noise ios

13
推荐指数
1
解决办法
1359
查看次数

如何在haskell快速傅里叶变换上应用parallelim数据?

我有一个用于解决快速傅里叶变换的haskell代码,我想在其上应用数据并行性.但是,我使用的每个策略都会产生太多的火花,而且大多数都会溢出.

有没有人知道如何在以下算法上应用良好的数据并行策略:

-- radix 2 Cooley-Tukey FFT

fft::[Complex Float] -> [Complex Float]
fft [a] = [a]
fft as = interleave ls rs
  where
    (cs,ds) = bflyS as
    ls = fft cs
    rs = fft ds

interleave [] bs = bs
interleave (a:as) bs = a : interleave bs as

bflyS :: [Complex Float] -> ([Complex Float], [Complex Float])
bflyS as = (los,rts)
  where
    (ls,rs) = halve as
    los = zipWith (+) ls rs
    ros = zipWith (-) ls rs
    rts …
Run Code Online (Sandbox Code Playgroud)

parallel-processing haskell fft

13
推荐指数
1
解决办法
706
查看次数

在八度音阶上绘制FFT

我知道FFT会将时域中的函数更改为频域中显示的函数.

然而,当我尝试在频域中绘制所述图形时,我只能通过将时间用作X轴来使其正常工作,当显然应该不是那个时,而是频率.

此外,我只能通过将y轴除以某个整数来获得与原始信号中的幅度匹配的幅度.这是为什么?

这是我的代码

t=0:0.001:2

x=2*sin(20*pi*t) + sin(100*pi*t)
subplot(2,1,1)
plot(1000*t,x)
grid
xlabel("Time in milliseconds")
ylabel("Signal amplitude")

subplot(2,1,2)
y=fft(x)
plot(1000*t,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")
Run Code Online (Sandbox Code Playgroud)

和图表.

在此输入图像描述

请帮助=(

plot signal-processing fft octave

13
推荐指数
3
解决办法
4万
查看次数