我已经为iPhone 实施了Demetri的Pitch Detector项目,并遇到了两个问题.1)任何类型的背景噪声发送频率读取香蕉和2)较低频率的声音没有正确调整.我试着调整我的吉他,而更高的琴弦工作 - 调谐器无法正确辨别低音.
音高检测代码位于RIOInterface.mm中,就像这样......
// get the data
AudioUnitRender(...);
// convert int16 to float
Convert(...);
// divide the signal into even-odd configuration
vDSP_ctoz((COMPLEX*)outputBuffer, 2, &A, 1, nOver2);
// apply the fft
vDSP_fft_zrip(fftSetup, &A, stride, log2n, FFT_FORWARD);
// convert split real form to split vector
vDSP_ztoc(&A, 1, (COMPLEX *)outputBuffer, 2, nOver2);
Run Code Online (Sandbox Code Playgroud)
然后Demetri继续确定"主导"频率如下:
float dominantFrequency = 0;
int bin = -1;
for (int i=0; i<n; i+=2) {
float curFreq = MagnitudeSquared(outputBuffer[i], outputBuffer[i+1]);
if (curFreq > dominantFrequency) {
dominantFrequency …
Run Code Online (Sandbox Code Playgroud) iphone signal-processing fft pitch-tracking accelerate-framework
我有这6个峰值均衡系数:
b0 = 1 + (? ? A)
b1 = ?2??C
b2 = 1 - (? ? A)
a0 = 1 + (? / A)
a1 = ?2 ? ?C
a2 = 1 ? (? / A)
Run Code Online (Sandbox Code Playgroud)
有了这些中间变量:
?c = 2 ? ? ? fc / fs
?S = sin(?c)
?C = cos(?c)
A = sqrt(10^(G/20))
? = ?S / (2Q)
Run Code Online (Sandbox Code Playgroud)
vDSP_deq22()
应该通过"5个单精度输入,滤波器系数" 的状态记录,但我有6个系数!另外,我以什么顺序将它们传递给vDSP_deq22()
?
更新(17/05):我建议大家使用我在github上发布的DSP类:https://github.com/bartolsthoorn/NVDSP它可能会为你节省很多工作.
我已经阅读了一段时间的FFT和音高检测,但是我在拼凑它时遇到了麻烦.
我已经知道Accelerate框架可能是最好的方法,我已经阅读了apple的示例代码,看看如何将它用于FFT.如果我想实时运行音调检测,那么FFT的输入数据是什么?我只是从麦克风传入音频流吗?我该怎么做?
另外,在我得到FFT输出后,如何从中获得频率?我到处读书,找不到任何例子或解释?
谢谢你的帮助.
我需要执行数组(向量)的自相关,但我找不到正确的方法.我相信我需要Accelerate Framework中的方法"vDSP_conv",但我无法按照如何成功设置它.最让我失望的是需要2个输入.也许我有错误的功能,但我找不到一个在单个矢量上运行的功能.
文档可以在这里找到
从网站复制
vDSP_conv
对两个向量执行相关或卷积; 单精度.
void vDSP_conv(const float __vDSP_signal [],vDSP_Stride __vDSP_signalStride,const float __vDSP_filter [],vDSP_Stride __vDSP_strideFilter,float __vDSP_result [],vDSP_Stride __vDSP_strideResult,vDSP_Length __vDSP_lenResult,vDSP_Length __vDSP_lenFilter);
参数
__vDSP_signal
Run Code Online (Sandbox Code Playgroud)Input vector A. The length of this vector must be at least __vDSP_lenResult + __vDSP_lenFilter - 1.
__vDSP_signalStride
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_signal.
__vDSP_filter
Run Code Online (Sandbox Code Playgroud)Input vector B.
__vDSP_strideFilter
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_filter.
__vDSP_result
Run Code Online (Sandbox Code Playgroud)Output vector C.
__vDSP_strideResult
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_result.
__vDSP_lenResult
Run Code Online (Sandbox Code Playgroud)The length of __vDSP_result.
__vDSP_lenFilter
Run Code Online (Sandbox Code Playgroud)The length of __vDSP_filter.
举个例子,假设你有一个数组float x = …
我使用vImageConvert_RGB888toPlanar8
和vImageConvert_Planar8toRGB888
来自Accelerate.framework将RGB24转换为BGR24,但是当需要转换的数据非常大时,例如3M或4M,需要花费的时间大约是10ms.所以有人知道一些足够快的想法吗?.我的代码如下:
- (void)transformRGBToBGR:(const UInt8 *)pict{
rgb.data = (void *)pict;
vImage_Error error = vImageConvert_RGB888toPlanar8(&rgb,&red,&green,&blue,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImageConvert_RGB888toARGB8888 error");
}
error = vImageConvert_Planar8toRGB888(&blue,&green,&red,&bgr,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImagePermuteChannels_ARGB8888 error");
}
free((void *)pict);
}
Run Code Online (Sandbox Code Playgroud) Apple建议您在使用Accelerate Framework时将数据对齐16字节.你在实践中如何做到这一点?
如果我有阵列int[10000];
,有pragma
吗?如何将其与16字节对齐?
我在Stackoverflow的第一个问题...希望我的问题足够具体.
我在Swift中有一个数组,在某些日期有测量值.喜欢:
var myArray:[(day: Int, mW: Double)] = []
myArray.append(day:0, mW: 31.98)
myArray.append(day:1, mW: 31.89)
myArray.append(day:2, mW: 31.77)
myArray.append(day:4, mW: 31.58)
myArray.append(day:6, mW: 31.46)
Run Code Online (Sandbox Code Playgroud)
有些日子不见了,我只是没有进行测量......所有测量都应该在一条线上,或多或少.所以我想到了线性回归.我找到了Accelerate框架,但缺少文档,我找不到示例.
对于缺失的测量,我希望有一个功能,输入缺失的一天,输出最佳猜测,基于其他测量.
func bG(day: Int) -> Double {
return // return best guess for measurement
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.一月
本学期,我正在将压缩感知算法实现为iPhone应用程序.为此,我需要一些好的矩阵/线性代数库.我对iOS和Python都有点新意,我正在寻找一些帮助来评估我的选择.
我知道iPhone有Accelerate框架,其中包括vecLib,BLAS和LAPACK,但我不熟悉它们的API(它们看起来相当令人困惑).
我玩过Python/numpy,我真的很喜欢它的使用方式 - 如果我有选择的话,我宁愿使用numpy over Accelerate.
我知道嵌入Python是可能的,但我自己也没有运气.我试图在一个XCode项目中包含Enthought的EPD.framework,但是在玩了一个小时左右之后没有让它工作.我认为编译numpy会更糟.
作为另一种选择,我可以使用Cython(http://cython.org/)生成C文件然后从中调用函数吗?我也试过这个,但是遇到了包含.so库并调用它的更多问题.有没有办法让Cython生成.c和.h文件?会说.c和.h文件仍然依赖于numpy?
我已经阅读了一些关于PyInstaller和freeze.py的内容.这些可以帮助我吗?
除了Accelerate或Python + numpy之外还有其他选择吗?Python + numpy是一个不错的选择,还是很难编译/构建?Cython是一个有效的解决方案吗?
谢谢!
看起来这应该比我发现它更简单.
我AVFoundation
在标准委托方法中有一个框架:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
Run Code Online (Sandbox Code Playgroud)
我想在哪里使用Accelerate.Framework
.将帧转换为灰度.
框架中有一系列转换方法,包括vImageConvert_RGBA8888toPlanar8()
,看起来它可能是我想看到的,但是,我找不到任何如何使用它们的示例!
到目前为止,我有代码:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
@autoreleasepool {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
/*Lock the image buffer*/
CVPixelBufferLockBaseAddress(imageBuffer,0);
/*Get information about the image*/
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
size_t stride = CVPixelBufferGetBytesPerRow(imageBuffer);
// vImage In
Pixel_8 *bitmap = (Pixel_8 *)malloc(width * height * sizeof(Pixel_8));
const vImage_Buffer inImage = { bitmap, height, width, stride };
//How …
Run Code Online (Sandbox Code Playgroud) iphone image-processing objective-c accelerate-framework vimage
据我了解,NumPy 在 1.20.0 版本中放弃了对使用 Accelerate BLAS 和 LAPACK 的支持。根据 NumPy 1.21.1 的发行说明,这些错误已得到解决,现在可以再次在 MacOS >= 11.3 上使用 Accelerate 框架从源代码构建 NumPy:https: //numpy.org/doc/stable/release/1.21 .0-notes.html,但我找不到任何有关如何执行此操作的文档。这似乎是一件有趣的事情,因为 Accelerate 框架应该针对 M 系列处理器进行了高度优化。我想这个过程是这样的:
site.cfg
类似于以下内容的文件:[DEFAULT]
library_dirs = /some/directory/
include_dirs = /some/other/directory/
[accelerate]
libraries = Accelerate, vecLib
Run Code Online (Sandbox Code Playgroud)
python setup.py build
问题是我不知道 1. 变量library_dirs
和include_dirs
应该是什么,以便 NumPy 知道使用 Accelerate BLAS 和 LAPACK 以及 2. 是否需要采取任何其他额外步骤。如果有人知道如何做到这一点或可以提供任何见解,我们将不胜感激。