- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我在使用 vDSP 实现 FFT 时遇到困难。我理解这个理论,但我正在寻找具体的代码示例。
我有一个 wav 文件的数据如下:
问题一、如何将音频数据进行FFT?
问题 2. 如何从 FFT 中获取输出数据?
问题 3。最终目标是检查低频声音。我该怎么做?
-(OSStatus)open:(CFURLRef)inputURL{
OSStatus result = -1;
result = AudioFileOpenURL (inputURL, kAudioFileReadPermission, 0, &mAudioFile);
if (result == noErr) {
//get format info
UInt32 size = sizeof(mASBD);
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD);
UInt32 dataSize = sizeof packetCount;
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount);
NSLog([NSString stringWithFormat:@"File Opened, packet Count: %d", packetCount]);
UInt32 packetsRead = packetCount;
UInt32 numBytesRead = -1;
if (packetCount > 0) {
//allocate buffer
audioData = (SInt16*)malloc( 2 *packetCount);
//read the packets
result = AudioFileReadPackets (mAudioFile, false, &numBytesRead, NULL, 0, &packetsRead, audioData);
NSLog([NSString stringWithFormat:@"Read %d bytes, %d packets", numBytesRead, packetsRead]);
}
}
return result;
}
FFT 代码如下:
log2n = N;
n = 1 << log2n;
stride = 1;
nOver2 = n / 2;
printf("1D real FFT of length log2 ( %d ) = %d\n\n", n, log2n);
/* Allocate memory for the input operands and check its availability,
* use the vector version to get 16-byte alignment. */
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
originalReal = (float *) malloc(n * sizeof(float));
obtainedReal = (float *) malloc(n * sizeof(float));
if (originalReal == NULL || A.realp == NULL || A.imagp == NULL) {
printf("\nmalloc failed to allocate memory for the real FFT"
"section of the sample.\n");
exit(0);
}
/* Generate an input signal in the real domain. */
for (i = 0; i < n; i++)
originalReal[i] = (float) (i + 1);
/* Look at the real signal as an interleaved complex vector by
* casting it. Then call the transformation function vDSP_ctoz to
* get a split complex vector, which for a real signal, divides into
* an even-odd configuration. */
vDSP_ctoz((COMPLEX *) originalReal, 2, &A, 1, nOver2);
/* Set up the required memory for the FFT routines and check its
* availability. */
setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);
if (setupReal == NULL) {
printf("\nFFT_Setup failed to allocate enough memory for"
"the real FFT.\n");
exit(0);
}
/* Carry out a Forward and Inverse FFT transform. */
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);
/* Verify correctness of the results, but first scale it by 2n. */
scale = (float) 1.0 / (2 * n);
vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);
vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);
/* The output signal is now in a split real form. Use the function
* vDSP_ztoc to get a split real vector. */
vDSP_ztoc(&A, 1, (COMPLEX *) obtainedReal, 2, nOver2);
/* Check for accuracy by looking at the inverse transform results. */
Compare(originalReal, obtainedReal, n);
谢谢
最佳答案
您将音频样本数据放入输入的实部,并将虚部归零。
如果您只对频域中每个 bin 的大小感兴趣,则可以为每个输出 bin 计算 sqrt(re*re + im*im)
。如果您只对相对 大小感兴趣,那么您可以删除 sqrt 并只计算平方大小,(re*re + im*im)
。
您将查看与您感兴趣的一个或多个频率相对应的一个或多个 bin 的大小(请参阅 (2))。如果您的采样率为 Fs,并且您的 FFT 大小为 N,则输出 bin i
的相应频率由 f = i * Fs/N
给出。相反,如果您对特定频率 f 感兴趣,则感兴趣的区间 i
由 i = N * f/Fs
给出。
附加说明:您需要申请一个合适的 window function (例如 Hann aka Hanning )到您的 FFT 输入数据,然后再计算 FFT 本身。
关于具有 Accelerate 框架 vDSP 的 iPhone FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6358764/
我一直在使用新的 swift 加速框架,因为我希望优化所有向量计算。 我发现了以下名为 vDSp 的枚举,它避免了我重写整套向量数学: https://developer.apple.com/docu
vDSP允许将离散傅立叶变换的结果作为复数向量进行计算。 函数vDSP_zvmags提供复数向量的平方范数。如何计算自变量(或者我应该自己动手做)? 最佳答案 我想你想要的是vDSP_zvphas h
我在使用苹果时遇到问题 examples对于 vDSP。我尝试了所有这些,但最后我需要卷积样本。我什至无法通过链接器获取它: Undefined symbols for architecture i3
当使用 vDSP 执行一些快速计算时,我通常不关心其中一个输出参数。假设我正在查找数组最大值的索引: var m:Float = 0 var i:vDSP_Length = 0 vDSP_maxvi(
给定 float 或 double 的一维 vector ,如何使用 Accelerate Framework 中 vDSP 库中的函数计算该 vector 的自相关? 有人会怀疑 vDSP_acor
我正在使用加速框架来优化我的 DSP 代码。有好几次我想将一个数组(或数组的一部分)的内容复制到另一个数组。 我似乎找不到合适的函数来执行此操作,所以我一直在做一些愚蠢的事情,即将数组乘以 1(或加
我对音频处理很感兴趣,我想进行 FFT 计算。许多资源和教程都说 vDSP 很棒。但是我不明白为什么计算后实部和虚部的大小是 N/2 ?我如何在 1024 个样本上获得 1024 个实值和虚值。例如t
我想用 Accelerate 框架创建一个正弦音发生器。我希望我的发生器具有启动/释放设置(即振幅包络)。 我了解如何创建一个充满正弦值的向量。我不知道的是如何将振幅包络应用于我的矢量数据。 我知道我
我在包含 vDSP 框架时遇到问题。我认为这只是要做的步骤: #include void test() { float a[1024], b[1024], c[1024]; vDSP_vmu
是否有合成器在代码中使用 vDSP 例程的任何 iOS/OSx 示例?或者至少,一些操作/优化音频数据的例子。想熟悉这些 vDSP 例程以优化代码,但还没有看到任何此类示例。 编辑:我发现了这个:ht
我有一系列离散值。所以,我没有输入部分的虚数值。我正在对这些值进行离散傅里叶变换并执行离散傅里叶逆变换,以获取相同的值。这个想法是为了测试来自 Accelerate Framework 的 vDSP
我正在使用 Accelerate 框架中的 vDSP 在来自网格的二维数组中执行 fft2d 操作。 问题是我得到一个虚部为 0 的数组,它与使用 pylab.fft2 的 python 中的相同操作
我正在尝试使用 xcode 6.1 从针对 ios 8.1 的 Swift 代码调用 vDSP 框架中的函数。下面是一个例子: public func create_fft_setup( length
在Accelerate Framework的vDSP函数中,所有的函数都需要你输入一个结果向量。如果我不再需要原始输入向量中的任何内容,将输入向量(或输入向量之一)作为结果向量传递是否正确? 我的意思
在 helpful but somewhat dated 中2006 年 11 月关于使用 vDSP 对代码进行矢量化的文章,作者声明: Important to keep in mind is th
我在 OS X 和 iOS 下使用 Apple 的 vDSP 原语有很好的经验。 http://developer.apple.com/library/mac/#documentation/Accel
我正在尝试使用 vDSP 在 iOS 中进行二维相位相关。我有 2 张相同大小的图像(宽度和高度是 2 的幂)。我想使用 vDSP_fft2d_zrip 对两个图像进行 fft然后将一个乘以另一个的共
我正在尝试使用 iOS 上的 Accelerate 框架来绕过 iOS 上的 Core Image 不支持自定义过滤器/内核这一事实。我正在使用 Sobel kernel 的两个卷积开发边缘检测过滤器
我正在使用 Apple 的 vDSP API 来计算音频的 FFT。但是,根据我对实际输入的 FFT 的理解,我的结果(在 amp[] 中)不是围绕 N/2 对称的,而它们应该是对称的? 在下面的 f
我是音频框架的新手,但经过一段时间的搜索后,我发现 iOS api 提供的用于数字信号处理的 Accelerate 框架。在我的项目中,我想将声音文件转换为 fft,以便我可以使用 fft 比较两个声
我是一名优秀的程序员,十分优秀!