我一直在浏览这篇精彩的文章:http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/
虽然太棒了,但它非常艰难而且沉重.这种材料真的让我感到舒服.
我从Stefan的代码模块中提取了数学,该代码模块计算给定bin的确切频率.但我不明白最后的计算.有人能告诉我最后的数学结构吗?
在深入研究代码之前,让我设置一下场景:
假设我们设置fftFrameSize = 1024,所以我们处理512 + 1个bin
例如,Bin [1]的理想频率适合帧中的单个波.在40KHz的采样率下,tOneFrame = 1024/40K秒= 1/40秒,因此Bin [1]理想地将采集40Hz信号.
设置osamp(overSample)= 4,我们以256为步长沿着输入信号前进.因此,第一个分析检查字节0到1023,然后是256到1279等.注意每个浮点数被处理4次.
...
void calcBins(
long fftFrameSize,
long osamp,
float sampleRate,
float * floats,
BIN * bins
)
{
/* initialize our static arrays */
static float gFFTworksp[2*MAX_FRAME_LENGTH];
static float gLastPhase[MAX_FRAME_LENGTH/2+1];
static long gInit = 0;
if (! gInit)
{
memset(gFFTworksp, 0, 2*MAX_FRAME_LENGTH*sizeof(float));
memset(gLastPhase, 0, (MAX_FRAME_LENGTH/2+1)*sizeof(float));
gInit = 1;
}
/* do windowing and re,im interleave */
for (long k = 0; …Run Code Online (Sandbox Code Playgroud) 更新2016-03-15
我做了很多研究,并学到了很多关于FFT和Accelerate Framework的知识.但经过几天的实验,我有点沮丧.
我想在图表中播放期间显示音频文件的频谱.对于每个时间间隔,它应该在X轴上通过FFT计算的每个频率(在我的情况下为512个值)显示Y轴上的数值(由红色条显示).
输出应如下所示:

我用1024个样本填充缓冲区,仅为开头提取左侧通道.然后我做所有这些FFT的东西.
到目前为止,这是我的代码:
设置一些变量
- (void)setupVars
{
maxSamples = 1024;
log2n = log2f(maxSamples);
n = 1 << log2n;
stride = 1;
nOver2 = maxSamples/2;
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
memset(A.imagp, 0, nOver2 * sizeof(float));
obtainedReal = (float *) malloc(n * sizeof(float));
originalReal = (float *) malloc(n * sizeof(float));
setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);
}
Run Code Online (Sandbox Code Playgroud)
做FFT.FrequencyArray只是一个包含512个浮点值的数据结构.
- (FrequencyArry)performFastFourierTransformForSampleData:(SInt16*)sampleData andSampleRate:(UInt16)sampleRate
{
NSLog(@"log2n %i n %i, …Run Code Online (Sandbox Code Playgroud) 在iOS上从音频流(音乐)获取Hz频率值的最佳方法是什么?Apple提供了哪些最好,最简单的框架.提前致谢.
//编辑...
我正在编辑我的问题,以解决专门处理非二次幂图像的问题.我有一个基本结构,适用于尺寸为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) 我已经阅读了一段时间的FFT和音高检测,但是我在拼凑它时遇到了麻烦.
我已经知道Accelerate框架可能是最好的方法,我已经阅读了apple的示例代码,看看如何将它用于FFT.如果我想实时运行音调检测,那么FFT的输入数据是什么?我只是从麦克风传入音频流吗?我该怎么做?
另外,在我得到FFT输出后,如何从中获得频率?我到处读书,找不到任何例子或解释?
谢谢你的帮助.
我想我在iPhone OS(iOS 4)中发现了一些宝石.
我发现Accelerate Framework提供了128位,256位,512位和1024位整数数据类型.Apple还实现了基本线性代数子程序(BLAS),Apple实现的LAPACK(线性代数PACKage)和数字信号处理(DSP)程序.
我很兴奋,因为据我所知,BLAS和LAPACK是最好的(也是最着名的)图书馆.(如果你从未听过他们的名字,只需谷歌他们,你就会理解.)他们让你解决联立线性方程(即矢量/矩阵表示法中的A x = b),进行快速矩阵乘法等等.
我很确定这些库可以在PowerPC和基于Intel的Mac上使用.但是,当我在Xcode中查找"iOS4中的新功能"文档时,它表示数据类型"在任何架构上都不受支持".当我比较适用于Mac OS X的vecLib参考和适用于iOS的vecLlib参考时,我还发现iOS版本中缺少功能.
我的问题是:
有没有人使用这些库编译任何程序(bignum是我感兴趣的主要领域)并在真正的iPhone设备上成功运行它们?(能够展示他们在图书馆的实际经验的答案者更感谢.)
以下是参考图书馆的链接:
加速框架(iOS参考图书馆)
vecLib参考(Mac OS X参考库)
vecLib参考(iOS参考库)
以下是BLAS和LAPACK的官方常见问题解答:
BLAS FAQ
LAPACK FAQ
我正在开发一个iPhone应用程序(如音频处理).我必须对音频做出一些影响.如果它是桌面应用程序,那里有很多选项.我们可以得到很好的例子和完整的项目,如大胆.但我想为iPhone开发.
我有一个带有混响选项的应用程序; (看看下面的链接).只是我看"视频",我没有在我的iPhone设备上测试这个应用程序.
http://www.appstorehq.com/reverb-iphone-89870/app
我的问题是; 如何使用混响功能开发应用程序?那有什么文件吗?如果是,请与我们分享.
注意: 我们可以使用AudioUnit开发具有混响功能的应用程序(我不清楚这一点.).
编辑:我不喜欢使用任何第三方库.
如果有人对此有所了解,请与我们分享.
谢谢.
我正在使用Accelerate框架来执行快速傅立叶变换(FFT),并且我正在尝试找到一种方法来创建一个缓冲区,以便使用长度为1024的缓冲区.我可以访问平均峰值和峰值.我想做FFT的信号.
有人可以帮我或给我一些提示吗?
我使用的是苹果的加速框架,讨论了关于iPhone执行FFT间距检测很多 次这里之前.
我理解相位偏移,bin频率,并且已经研究了几种使用FFT技术(简单音调检测,自相关,倒谱等)来检测音调的开源调谐器.这是我的问题:
我的FFT结果始终偏离5-10 Hz(+/-),即使这些箱仅相隔1-2赫兹.我尝试过不同的算法,即使是以高分辨率采样的简单FFT也会显示出看似错误的地方的幅度峰值.这不是一致的偏移; 有些太高,有些太低.
例如,440Hz的音调为445.2 Hz; 220Hz为214Hz; 880Hz为874Hz; 使用音调发生器,1174Hz为1183Hz.使用几乎完全相同的算法的Mac 类似的开源调谐器没有问题完美地检测音调.(这些差异在设备上与模拟器不同,但它们仍处于关闭状态.)
我不认为问题是分辨率,因为实际音调和检测到的幅度尖峰之间通常有几个分档.好像输入只是听错了音调.
我在下面粘贴了我的代码.一般流程很简单:
向FFT缓冲区推进一步 - > Hann窗口 - > FFT - >相位/幅度 - >最大间距错误.
enum {
kOversample = 4,
kSamples = MAX_FRAME_LENGTH,
kSamples2 = kSamples / 2,
kRange = kSamples * 5 / 16,
kStep = kSamples / kOversample
};
const int PENDING_LEN = kSamples * 5;
static float pendingAudio[PENDING_LEN * sizeof(float)];
static int pendingAudioLength = 0;
- (void)processBuffer {
static float window[kSamples];
static …Run Code Online (Sandbox Code Playgroud) 我在这里看过各种FFT问题,但我对部分实现感到困惑.我没有实时执行FFT,而是想离线执行.让我们说我有原始数据float[] audio.采样率为44100,因此audio[0] to audio[44099]将包含1秒的音频.如果我的FFT函数处理窗口(例如汉宁),我是否只需将整个audio缓冲区一次性放入函数中?或者,我是否必须将音频切换为4096(我的窗口大小)的块,然后将其输入FFT,然后在顶部执行窗口功能?
我在iphone上制作应用程序,我需要一种方法来检测通过麦克风传来的声音.(即A#,G,C♭等)我以为我会使用AVAudio,但我真的不知道,我在文档中找不到任何东西..
有帮助吗?
我想要检测的不是音高,而是发出唱音的音高等级.
因此,无论是C4还是C5都不重要:它们必须都被检测为C.
想象一下,12个半音安排在钟面上,针指向音高等级.这就是我追求的!理想情况下,我希望能够分辨出唱歌音符是点亮还是稍微偏离.
这与先前提出的问题不重复,因为它引入了以下约束条件:
声源是一个人的声音,希望背景干扰可以忽略不计(虽然我可能需要处理这个问题)
八度音阶并不重要,只有音高等级
编辑 - 链接:
实时音高检测
使用Apple FFT和加速框架