灵感来自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) 我在网上找到了许多用于在iOS中处理音频的例子,但是大多数都已经过时了,并不适用于我想要完成的任务.这是我的项目:
我需要从两个来源捕获音频样本 - 麦克风输入和存储的音频文件.我需要对这些样本执行FFT以产生整个剪辑的"指纹",以及应用一些额外的过滤器.最终目标是构建一种类似于Shazam等的歌曲识别软件.
在iOS 8中捕获单个音频样本以执行快速傅里叶变换的最佳方法是什么?我想最终会有大量的这些,但我怀疑它可能不会像那样.其次,如何使用Accelerate框架处理音频?它似乎是在iOS中对音频执行复杂分析的最有效方式.
我在网上看到的所有例子都使用旧版本的iOS和Objective-C,但我无法将它们成功转换为Swift.iOS 8是否为这类东西提供了一些新的框架?
我正在尝试处理音频数据.我正在使用Java.我已将音频数据提取到数组中.现在我应该将N个数据样本传递给计算离散傅里叶变换(或快速傅里叶变换,这样更有效)的函数.我读过文档,但是我越来越困惑了.我想要计算的是幅度谱(| X(k)|).谁能帮我?谢谢
我正在使用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是那么
Run Code Online (Sandbox Code Playgroud)a[2*k] = Re[k], 0 <= k < n / 2 a[2*k+1] = Im[k], 0 < k < n / 2 a[1] = Re[n/2]如果n是奇数那么
Run Code Online (Sandbox Code Playgroud)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]此方法仅计算实数变换的一半元素.另一半满足对称条件.如果您想要完全真正的正向变换,请使用realForwardFull.要获取原始数据,请在此方法的输出上使用realInverse.
参数:a - 要转换的数据
现在使用上面的方法:(因为我的数据数组的长度是10,所以使用"n是偶数"方法)
Re[0] = 10952
Re[1] = 80.052
Re[2] = …Run Code Online (Sandbox Code Playgroud) 我正在为最新版本的FFTW寻找一个最小的Java包装器.在FFTW网站上列出的包装器要么过时(jfftw-1.2.zip),要么包含太多额外的东西(Shared Scientific Toolbox).谷歌搜索建议JFFTW3看起来很有前景,但下载链接已经破了(有人有镜子吗?)
对于那些想要纯Java FFT库的人来说,JTransforms看起来非常好.我更喜欢使用FFTW,因为它大约快两倍,它处理任意尺寸d> 3.
我正在尝试重新实现其中一个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) //编辑...
我正在编辑我的问题,以解决专门处理非二次幂图像的问题.我有一个基本结构,适用于尺寸为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) 我正在制作一个应该播放简单音轨的应用程序,让我知道在播放曲目时附近是否有噪音.这是通过在iPhone的扬声器上播放歌曲时从麦克风进行实时录制来完成的.任何不属于音乐播放的声音都被定义为噪音.
实现此功能的最简单方法是什么?
我在网上进行了相当广泛的研究,但是我找不到任何能指出这个特定问题的解决方案的东西.虽然它可能是我阅读的不同技术的组合,但最终将成为解决方案.
我已经实现的东西
同时播放歌曲和录制音频.
我尝试过的事情
注意:由于我们鼓励我们添加我们已尝试的内容,因此我添加以下部分.但我绝不是说这是解决问题的正确方法,这只是我尝试过的事情.
我攻击了aurioTouch2示例应用程序:我所做的是回放一次歌曲并记录快速傅立叶变换值(以非常低的采样率保持记录数据的数量较低).然后,当再次播放曲目时,我基本上计算(每个时间步长)使用实时回放fft数据构建的输出图形与记录的fft数据之间的相关系数(所以当你放置时看到的'波浪'线条)应用于fft模式).
这种"有点"有效.当房间内有过多的声音/噪音时,相关系数明显较低,但它不是非常敏感,也取决于记录fft数据时使用的音量.最后,我认为这可能不是最好的方法.
有人认为这是可能的吗?如果是这样,最好的方法是什么?
请询问您是否需要更多说明!
我有一个用于解决快速傅里叶变换的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) 我知道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)
和图表.

请帮助=(