gpt4 book ai didi

ios - 如何让我的iPhone听超过特定阈值的声音频率?

转载 作者:行者123 更新时间:2023-12-01 16:32:55 28 4
gpt4 key购买 nike

我对让我的iOS应用打开麦克风并仅收听17000 Hz以上的频率感兴趣。如果听到的声音在该范围内,我希望该应用程序调用一个方法。

我能够找到一个检测频率的存储库:https://github.com/krafter/DetectingAudioFrequency

这是分解FFT的帖子:
Get Hz frequency from audio stream on iPhone

使用这些示例,我已经能够使手机对听到的最强频率使用react,但是我对仅对17000 Hz以上的频率使用react更感兴趣。

最佳答案

我编写该代码的事实可以帮助我回答这个问题,但答案可能仅适用于此代码。

您只需将输出阵列修整为仅包含所需范围的片段,就可以轻松限制听的频率。

详细信息:为简单起见-array [0..255]包含频域中的音频。例如,执行FFT时的采样率为44100。
这样,您可以编码的最大频率为22050。(奈奎斯特定理)。

也就是说,数组[0]包含22050/256 = 86.13 Hz的值。数组[1]包含86.13 * 2 = 172.26 Hz的值,数组[2]包含86.13 * 3 = 258.39 Hz的值。等等。您的全部范围分布在这256个值中。 (是的,精度会受到影响)

因此,如果您只需要收听某个范围,比如说高于17000Hz,则只需占用该阵列的一部分,而忽略其余部分。在这种情况下,您将17000 / 86.13 = 197转换为255个子数组即可。只有17000-22050范围。

在我的仓库中,您可以像这样修改 strongestFrequencyHZ 函数:

static Float32 strongestFrequencyHZ(Float32 *buffer, FFTHelperRef *fftHelper, UInt32 frameSize, Float32 *freqValue) {
Float32 *fftData = computeFFT(fftHelper, buffer, frameSize);
fftData[0] = 0.0;
unsigned long length = frameSize/2.0;
Float32 max = 0;
unsigned long maxIndex = 0;

Float32 freqLimit = 17000; //HZ

Float32 freqsPerIndex = NyquistMaxFreq/length;
unsigned long lowestLimitIndex = (unsigned long) freqLimit/freqsPerIndex;

unsigned long newLen = length-lowestLimitIndex;
Float32 *newData = fftData+lowestLimitIndex; //address arithmetic
max = vectorMaxValueACC32_index(newData, newLen, 1, &maxIndex);
if (freqValue!=NULL) { *freqValue = max; }
Float32 HZ = frequencyHerzValue(lowestLimitIndex+maxIndex, length, NyquistMaxFreq);
return HZ;

}

我在那里做了一些地址运算,所以看起来有点复杂。您可以只采用 fftData 数组并执行常规操作。

其他注意事项:

寻找最强的频率。简单。您只在该数组中找到最大值。而已。但是,在这种情况下,您需要监视范围,并确定其何时从常规的弱噪声变为强信号。换句话说,当东西达到顶峰时,这不是那么简单,而是可能的。尽管这不是最佳选择,但您可能只需要设置一些限制即可检测到信号,超过该限制。

我宁愿对现实中的这个原因感到乐观,因为在您周围18000Hz处看不到太多的噪声。唯一能记住的是一些老式电视机在打开时会发出高音调的声音。

关于ios - 如何让我的iPhone听超过特定阈值的声音频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30851522/

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