问题标签 [pitch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 使用自相关的音高检测
我正在使用自动相关功能来检测信号的音高。我正在使用等式 acf(s)=(1/n)*sigma(|x(n)-x(n+s)|)
我该如何从这里开始。我应该找到最小值,而音高是最小值的索引。在这种情况下,音高始终为 0。我做得对吗?我需要帮助。谢谢。
ios - iOS:Pitch Shifting & Piping 从 OpenAL 输出到缓冲区
我最近发现在 iOS 中可以使用 OpenAL 进行音高转换。
我在看 Hollance 的声音银行播放器。它接收分布在整个范围内的 15 个左右的钢琴音符,并通过确定它最接近哪个样本来播放任何音符,并将该样本的音高移动适当的量。这是执行此操作的代码:
你可以看到这条线做了音高转换:
不幸的是,这对于同时演奏一捆音符没有好处,因为它占用了太多的 CPU。它是动态的音调变化。
我想要的是为每个钢琴音符创建一个缓冲区,并使用这种音高转换技术填充这些缓冲区。但我看不到如何让 openAL 将声音播放到缓冲区中,而不是通过扬声器播放出来。
有什么方法可以输出 alSourcePlay(source->sourceId);
进入缓冲区?
如果我不能这样做,我有什么选择?我曾尝试使用 DSPDimension 文章中的 smbPitchShift,但它并没有提供良好的保真度:钢琴音符的起音阶段确实丢失了。我想我可以使用免费版的 Dirac3...(我目前没有钱购买完整版,但我认为免费版允许单声道处理,所以我可以破解它)。还有其他选择吗?
编辑:我已经测试了 Dirac3,它也有同样的问题。它似乎包围了攻击。似乎 OpenAL 的音调转换器以某种方式做了 Dirac3 没有做的事情。
signal-processing - 用于音高检测的倒谱分析
我正在寻找从声音信号中提取音高。
IRC 上的某个人刚刚向我解释了采用双 FFT 是如何实现这一点的。具体来说:
- 采取 FFT
- 取绝对值平方的对数(可以通过查找表完成)
- 再做一次 FFT
- 取绝对值
我正在尝试使用 vDSP
我无法理解我之前怎么没有遇到过这种技术。我做了很多狩猎和提问;几个星期的价值。更重要的是,我不明白为什么我没有想到它。
我正在尝试使用 vDSP 库来实现这一点。它看起来好像具有处理所有这些任务的功能。
但是,我想知道最终结果的准确性。
我以前使用过一种技术,该技术可以搜索单个 FFT 的频率区间以获得局部最大值。当它遇到一个时,它会使用一种巧妙的技术(自上次 FFT 以来的相位变化)来更准确地将实际峰值放置在 bin 内。
我担心我在这里介绍的这种技术会失去这种精度。
我想该技术可以在第二次 FFT 之后使用,以准确地获得基础。但看起来信息在第 2 步中丢失了。
由于这是一个潜在的棘手过程,有经验的人可以看看我在做什么并检查它的完整性吗?
另外,我听说有一种替代技术涉及在相邻的 bin 上拟合二次方。这是否具有可比性的准确性?如果是这样,我会喜欢它,因为它不涉及记住 bin 阶段。
所以,问题:
- 这种方法有意义吗?可以改进吗?
- 我有点担心“对数方”组件;似乎有一个 vDSP 函数可以做到这一点:vDSP_vdbcon。但是,没有迹象表明它预先计算了一个日志表——我认为它没有,因为 FFT 函数需要调用一个显式的预先计算函数并将其传递给它。而这个功能没有。
- 是否存在拾取谐波的危险?
- 有没有什么巧妙的方法可以让 vDSP 拉出最大值,最大的优先?
谁能指出我对这种技术的一些研究或文献?
主要问题:它是否足够准确?精度可以提高吗?一位专家刚刚告诉我,准确性确实不够。这是行的尽头吗?
圆周率
PS 当我想创建标签时我很生气,但不能。:| 我已经向维护者建议跟踪尝试的标签,但我确定我被忽略了。我们需要 vDSP、加速框架、倒谱分析的标签
java - 音高检测和改变java
我是法国人,如果您无法理解我的某些句子,我很抱歉。无论如何,我在一些主题中看到,由于傅里叶变换,音高可以得到体现,但我并不真正了解如何实现它。此外,我没有找到如何更改 wav 文件的音高,如果可能的话,我正在使用 javaSound 的 wav 和 JLayer 的 mp3 听音乐的 mp3 文件。谢谢
java - 绘制声音的音高(频率)
我想将声音的音高绘制成图表。
目前我可以绘制幅度。下图是由返回的数据创建的getUnscaledAmplitude()
:
但我需要显示音频的音高,而不是幅度。快速傅里叶变换似乎可以得到音调,但它需要知道比我拥有的原始字节更多的变量,并且非常复杂和数学。
有没有办法我可以做到这一点?
android - 横向模式下的俯仰问题
我需要在纵向和横向模式下读取音高值(手机前后倾斜的程度)。使用纵向下面的代码,我从 value[1] 中得到我的值,当手机面朝上平放时为 0.0,直立时为 -90,平放在设备正面时为 180。到目前为止一切都很好......当设备处于横向模式时问题就来了。此时我正在使用 value[2] 来测量设备倾斜度,但问题在于值:0 当手机保持平放时(OK)上升到 90 当它直立时(OK),但是当我继续运动值再次下降到 90(80、75 等)以下,所以基本上我无法区分这两个位置,因为值是相同的。所以,我做错了什么,
与此处相同的问题:http ://groups.google.com/group/android-beginners/browse_thread/thread/c691bbac3e294c7c?pli=1
我有以下代码:
}
algorithm - 从潜在谐波中确定基频的算法
我正在尝试从声源中提取基频。也许有人在对着麦克风唱 A3,所以我想检测 ~ 110Hz
我的方法是:
- FFT 1024 浮点数
- 使用每个 bin 的相位来准确确定其精确频率
- 确定峰值(通常为 50 左右)
- 以最响亮的顺序排列它们
(Peak[0].power=1063.343750, .freq=2032.715088
(Peak[1].power=1047.764893, .freq=3070.605225
(Peak[2].power=1014.986877, .freq=5925.878418
(Peak[3].power= 1011.707825,.freq=6963.769043
(峰值[4].power=1009.152954,.freq=4022.363037
(峰值[5].power=995.199585,.freq=4974.120605
(
峰值[6].power=987.248713,24.freq=887.79 )
[7].power=533.514832,.freq=908.691833
- (MARKER1)从最响亮的开始,并将其与所有剩余的峰值相匹配,所以如果我有 N 个峰值,我将在这一点上有 N-1 个峰值对
- 检查每个峰值对的谐波;即它与某个分数 a/b 有多接近,即我们能否找到 b<20 的 a/b 使得 |peakA.freq/peakB.freq - a/b| < 0.01(这将匹配高达 20 次的谐波)
我们现在有一个精确的峰值列表,这些峰值被认为是彼此谐波
谐波峰值对:(0,1)=2/3,误差:0.00468 => f0 @ 1019.946289
谐波峰值对:(0,2)=1/3,误差:0.00969 => f0 @ 2004.003906
谐波峰值对:(0,3) =2/7,误差:0.00618 => f0 @ 1005.590820
谐波峰值对:(0,4)=1/2,误差:0.00535 => f0 @ 2021.948242
谐波峰值对:(0,5)=2/5,误差:0.00866 => f0 @ 1005.590820
谐波峰值对:(0,6)=1/4,误差:0.00133 => f0 @ 2027.331543
谐波峰值对:(0,7)=9/4,误差:0.01303 => f0 @ 226.515106
我的问题是:我怎样才能设计出一种算法,将上述基本频率正确识别为 ~1000Hz?
绝不保证在 ~1000 处的值会比在 ~2000 或 ~3000 处更高的集中度等。甚至不能保证在 ~1000 处会有任何条目。我们可以有 ~5000 x 一个条目,~4000 x 三个条目,~3000 x 2 条目,以及一些浮动的虚假值,比如上面列表中的 226。
我想我可以再次重复该过程,剔除与列表的其余部分不“和谐”的建议基本面。这至少会摆脱虚假的价值观......
可能我什至没有问正确的问题。也许这整个方法很糟糕。但我认为选择最强的峰值并提取一组与该峰值相关的谐波是有意义的。
理论上应该产生一个比率的负载,比如如果原始最强峰值是三次谐波,那么这组峰值应该包含 3/1 3/2 3/3 3/4 3/5 3/6 3/7 等...虽然有些可能会丢失。
实际上,我有一种感觉,它总是要么是基频要么是具有最大强度的一次谐波。但我不知道我是否可以依靠这个......
这么多因素,它让我头晕目眩。对于这样一个乱七八糟的问题,我提前道歉。希望我能在死后整理一下。
c# - C# 的 FFT 不准确性
我一直在试验 FFT 算法。我使用 NAudio 以及来自互联网的 FFT 算法的工作代码。根据我对表演的观察,得到的音高是不准确的。
发生的情况是我有一个 MIDI(从 GuitarPro 生成)转换为 WAV 文件(44.1khz,16 位,单声道),其中包含从 E2(最低吉他音符)到大约 E6 的音高进程。较低的音符(E2-B3 附近)的结果通常是非常错误的。但是达到 C4 它在某种程度上是正确的,因为您已经可以看到正确的进程(下一个音符是 C#4,然后是 D4 等)但是,问题在于检测到的音高比实际音高低半音(例如 C4 应该是音符,但显示 D#4)。
你认为可能有什么问题?如有必要,我可以发布代码。非常感谢!我还是开始掌握DSP领域。
编辑:这是我在做什么的一个粗略的划痕
然后:(waveBuffer 只是一个将 byte[] 转换为 float[] 的类,因为该函数只接受 float[])
最后:(Smbpitchfft 是具有 FFT 算法的类......我相信它没有任何问题,所以我不在这里发布)
并解释结果:
更新(如果有人仍然感兴趣):
因此,以下答案之一表明来自 FFT 的频率峰值并不总是等于音高。我明白那个。但如果是这种情况,我想为自己尝试一些东西(假设有时频率峰值是产生的音高)。所以基本上,我得到了 2 个能够显示音频信号频域的软件(DewResearch 的 SpectraPLUS 和 FFProperties;归功于他们)。
所以这里是时域中频率峰值的结果:
SpectraPLUS
和 FFT 属性:
这是使用 A2 的测试笔记(大约 110Hz)完成的。查看图像时,SpectraPLUS 的频率峰值在 102-112 Hz 范围内,FFT 属性的频率峰值在 108 Hz 范围内。在我的代码中,我得到 104Hz(我使用 8192 个块和 44.1khz 的采样率......然后将 8192 加倍以使其成为复杂输入,所以最后,与 SpectraPLUS 的 10Hz binsize 相比,我得到大约 5Hz 的 binsize )。
所以现在我有点困惑,因为在软件上它们似乎返回了正确的结果,但在我的代码上,我总是得到 104Hz(请注意,我已经将我使用的 FFT 函数与 Math.Net 等其他函数进行了比较,它似乎是正确的)。
你认为问题可能出在我对数据的解释上吗?或者软件在显示频谱之前会做其他事情吗?谢谢!
fft - 关于 FFT 和 Pitch Estimation 的几个问题
一般来说,我需要对 FFT 和音高估计进行一些澄清。
1.)我读到 FFT 的块大小越大,它的准确性就越高,尽管我知道这也有不利的一面。这是真的吗?因为我一直在试验,每当我使用 16384 的块大小而不是 8192 或 4096 时,我得到的结果更糟。有人可以澄清一下吗?
2.) 最初,我认为从 FFT 中获得音高只是获得最高强度的 bin 的简单问题。但是,在这里发布并阅读了一些问题之后,我认为可能还有更多的this。有人可以建议我如何从 FFT 中获得良好的音高估计吗?
3.)虽然我已经有了一个好主意,但有人可以简单地解释一下自相关器算法的作用吗?(我的想法是它基本上是一种比较和对比算法,差异最小的就是选择的算法)
非常感谢!
ios - 在 iOS 上录制、修改和播放音频
编辑:最后我完全按照下面的解释使用了 AVRecorder 用于录制语音,而 openAL 用于音高转换和播放。结果很好。
我有一个关于录制、修改和播放音频的问题。我之前问过一个类似的问题(在 iOS 上实时录制、修改音高和播放音频),但我现在有了更多信息,可以提供一些进一步的建议。
所以首先这是我想要做的(在主线程的单独线程上):
- 监控 iphone 麦克风
- 检查大于某个音量的声音
- 如果高于阈值开始记录,例如人开始说话
- 继续录音,直到音量降至阈值以下,例如人停止说话
- 修改录制声音的音高。
- 播放声音
我正在考虑使用 AVRecorder 来监控和录制声音,这里有很好的教程:http: //mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
我正在考虑使用 openAL 来修改录制音频的音高。
所以我的问题是,我在上述要点列表中的想法是否正确,我是否遗漏了什么或者有更好/更简单的方法来做到这一点。我可以避免混合音频库而只使用 AVFoundation 来改变音高吗?