gpt4 book ai didi

iphone - 确定 aurioTouch 示例应用程序中哪些频率对应于 x 轴

转载 作者:行者123 更新时间:2023-12-03 19:12:42 25 4
gpt4 key购买 nike

我正在查看aurioTouch sample application用于 iPhone SDK。它有一个基本的spectrum analyzer当您选择“FFT”选项时实现。该应用程序缺少的东西之一是 X 轴标签(即频率标签)。

aurioTouchAppDelegate.mm文件中,第652行函数- (void)drawOscillscope中,有以下代码:

if (displayMode == aurioTouchDisplayModeOscilloscopeFFT)
{
if (fftBufferManager->HasNewAudioData())
{
if (fftBufferManager->ComputeFFT(l_fftData))
[self setFFTData:l_fftData length:fftBufferManager->GetNumberFrames() / 2];
else
hasNewFFTData = NO;
}

if (hasNewFFTData)
{

int y, maxY;
maxY = drawBufferLen;
for (y=0; y<maxY; y++)
{
CGFloat yFract = (CGFloat)y / (CGFloat)(maxY - 1);
CGFloat fftIdx = yFract * ((CGFloat)fftLength);

double fftIdx_i, fftIdx_f;
fftIdx_f = modf(fftIdx, &fftIdx_i);

SInt8 fft_l, fft_r;
CGFloat fft_l_fl, fft_r_fl;
CGFloat interpVal;

fft_l = (fftData[(int)fftIdx_i] & 0xFF000000) >> 24;
fft_r = (fftData[(int)fftIdx_i + 1] & 0xFF000000) >> 24;
fft_l_fl = (CGFloat)(fft_l + 80) / 64.;
fft_r_fl = (CGFloat)(fft_r + 80) / 64.;
interpVal = fft_l_fl * (1. - fftIdx_f) + fft_r_fl * fftIdx_f;

interpVal = CLAMP(0., interpVal, 1.);

drawBuffers[0][y] = (interpVal * 120);

}
cycleOscilloscopeLines();

}

}

根据我的理解,这部分代码用于决定在 UI 中为每个频率绘制哪个幅度。我的问题是如何确定每次迭代(或 y 值)在 for 循环内代表的频率。

例如,如果我想知道 6kHz 的幅度是多少,我会考虑添加类似于以下内容的行:

if (yValueRepresentskHz(y, 6))
NSLog(@"The magnitude for 6kHz is %f", (interpVal * 120));

请注意,虽然他们选择使用变量名y,但据我了解,它实际上代表了频谱分析仪可视化图中的x轴,以及值drawBuffers[0][y] 的 代表 y 轴。

最佳答案

我相信它使用的每个垃圾箱的频率由下式给出

yFract * hwSampleRate * .5

我相当确定您需要 0.5,因为 yFract 是总 fftLength 的一小部分,并且 FFT 的最后一个 bin 对应于采样率的一半。因此,你可以做类似的事情

NSLog(@"The magnitude for %f Hz is %f.", (yFract * hwSampleRate * .5), (interpVal * 120));

希望这至少能帮助您指明正确的方向。

关于iphone - 确定 aurioTouch 示例应用程序中哪些频率对应于 x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2949893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com