我试图找到一种方法来比较使用不同仪器上播放的相同音符的MATLAB短500毫秒录音的相似度.
详细介绍这个特定主题:我是一名音乐专业学生,其任务是客观地确定各种现代低铜乐器的音调,以确定哪种乐器应该取代过时的"ophicleide"或Bass keyed bugle.我首先使用它的光谱仪和其他6种仪器的视觉比较,但这种方法过于主观.
我用相同的麦克风,设备,增益级别和相同的音符录制了所有乐器.出于这个原因,我相信信号足够类似于使用MATLAB工具.
我认为比较这fft将是最准确的计算.我首先尝试了一个频域相关,并测试了相同音调的不同段(eu并且eu2是变量)
>> corr(abs(fft(eu)),abs(fft(eu2)))
ans = 0.9963
Run Code Online (Sandbox Code Playgroud)
这是朝着正确方向迈出的一步,但是当我比较不同的信号时,我似乎得到了相反的结果:(次中音和ophicleide声音几乎相同)
>> corr(abs(fft(eu)),abs(fft(ophi)))
ans = 0.5242
Run Code Online (Sandbox Code Playgroud)
次中音和低音单簧管声音完全不同,但这表明相关性较高
>> corr(abs(fft(eu)),abs(fft(basscl)))
ans = 0.8506
Run Code Online (Sandbox Code Playgroud)
我尝试了在网上找到的归一化最大互相关幅度公式,但我得到了相同的结果
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x =eu2; y = eu; norm_max_xcorr_mag(x,y)
ans = 0.9638
Run Code Online (Sandbox Code Playgroud)
比较其他样本时,我得到了类似的结果
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = basscl;
ans = 0.6825
Run Code Online (Sandbox Code Playgroud)
相比
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = ophi; norm_max_xcorr_mag(x,y)
ans = 0.3519
Run Code Online (Sandbox Code Playgroud)
Euphonium和Bass单簧管(basscl)具有完全不同的声音和完全不同的谐波系列,但这些公式显示出比次谐波和Ophicleide更接近的相关性,其频带看起来几乎完全相同.
我担心这些相关性显示真实音高的相关性(我在所有这些乐器上播放相同的音符,但是Ophicleide可能会失调高达1 Hz)它也可能是相位,甚至是总振幅.
在比较这些复杂波形的谐波泛音的比例时,有没有人知道更好的明确方法?
还是我吠叫错了树?
我正在尝试使用C++进行实时音高检测.我正在测试一些来自Performous(http://performous.org/)的代码,因为其他一切对我来说都不起作用.我确信这有效,但我不能让它发挥作用.我已经尝试了几个星期了,而且我还没有能够得到任何音调检测代码.
我是这个领域的新手 - 但我需要在java中执行WAV-to-MIDI转换.有没有办法知道WAV-to-MIDI转换涉及的步骤究竟是什么?我有一个非常粗略的想法,因为你需要; 对wav文件进行采样,对其进行滤波,使用FFT进行频谱分析,进行特征提取,然后将提取的特征写入MIDI.但我找不到如何做到这一切的可靠来源或论文?有人可以给我提供线索,如何以及从何处开始?是否有任何开源API可用于此WAV-to-MIDI转换过程?
谢谢
我正在尝试使用ANN进行音符的音高检测.网络是一个简单的双层MLP,其输入基本上是DFT(平均和对数分布),12个输出对应于特定八度音阶的12个音符.
通过某些乐器演奏的12个音符的一些样本(一次一个音符)和几个"静音"样本训练网络.
结果实际上很好.网络能够准确地检测出不同乐器所演奏的音符,它相对于噪音,甚至在播放歌曲时也不会完全放松.
然而,目标是能够检测复音.因此,当两个或多个音符一起播放时,两个相应的神经元将会发射.令人惊讶的是,网络实际上已经在某种程度上做到了这一点(仅对单声道样本进行训练),但是与单声道音符相比,不那么一致且不太准确.我的问题是如何增强它识别多元音的能力?
问题是我不明白为什么它实际上已经有效了.不同的音符(或它们的DFT)基本上是训练网络的空间中的不同点.所以我明白为什么它会识别出类似的声音(附近的点),而不是它如何"结束"一组音符的输出(它们与每个训练样例形成一个遥远的点).与(0,0)(0,1)(1,0)=(0)训练的AND网络相同的方式不会"结束"(1,1)=(1).
对此采取的蛮力是用尽可能多的复音样本训练网络.然而,由于网络似乎以某种方式模糊地从单声道样本中抓住了这个想法,所以这里可能还有一些更有趣的东西.
有什么指针吗?(抱歉长度,顺便说一句:).
signal-processing machine-learning pitch-tracking neural-network
我有关于使用Java进行音乐转录的项目,事情是,我创建了一个记录声音并将其保存到WAV文件的applet,播放器应该只播放他/她想要转录的片段,之后我被卡住了在这一点上,我必须从保存的WAV文件中获取信息并使用此信息创建一个MIDI文件,并在创建MIDI文件后,我必须为它生成一个乐谱(乐谱),所有这些必须完成在Java中.
我到处寻找关于如何完成这些工作的明确解释,但我没有找到任何直接的东西:(因为我是Java的新手,我希望有人能帮我解决这个问题,我在编程时遇到的问题是:
在对正在读取的数据执行分段后,我也尝试过快速傅立叶变换,但我认为这绝对是在错误的方向:(
如果有人可以帮助我完成上面指定的主题,以及如何只用Java编程,那将非常感激:)
顺便说一句,该项目是:
玩家在钢琴上弹奏音符>>记录他的演奏>>玩家获得他演奏的分数.
有没有人知道是否有好的软件可以执行从(波形或mp3或其他已知格式)到MIDI的转换?我知道从音频文件到MIDI的转换是一个非常复杂的过程.我目前正在为我的学士学位开发一个课程项目,需要操作MIDI文件.
如果你知道任何好的软件,我会接受建议.我更喜欢通过传递要转换的文件也可以从shell执行的软件.
任何帮助表示赞赏.
嗨,我是音频相关编码的菜鸟,我正在使用音调跟踪DLL,我将尝试创建一种开源版本的视频游戏Rocksmith作为学习体验.
到目前为止,我已经设法使FFT工作,所以我可以通过使用算法检测音高频率(Hz),下表我可以设法确定八度音程(第2到第6)和音符(C到B)打了便条.
下一步是检测字符串,以便我可以确定音品.

我一直在考虑它,理论上我可以使用它,我会知道用户何时正在播放正确的音符,但游戏可能是"黑客",因为只使用Hz,游戏无法检测到音符以正确的字符串播放.例如,第5弦+第1音品= C4 261.63Hz等于第6弦+第5音品= C4 261.63Hz.
让用户在错误的字符串中播放音符并将其设置为正确的可能性很低,但我认为知道该字符串真的很好,所以当他们播放错误的字符串时我可以向用户提供一些错误反馈(如你应该上弦或下线).
你知道我能做些什么来检测字符串吗?提前致谢 :)
[编辑]
我们使用的吉他和琴弦会影响音色,因此分析音色似乎不是检测琴弦的简单方法:
"吉他音色的变化是由拾音器的设计和位置,吉他的自然共振和阻尼产生的,因为使用的木材(这是一种不同的木材!)及其结构和形状,你的琴弦的规格和年龄,你的演奏技巧,你烦恼和拔弦的地方,等等."
我使用Librosa库进行音高和起始检测.具体来说,我正在使用onset_detect和piptrack.
这是我的代码:
def detect_pitch(y, sr, onset_offset=5, fmin=75, fmax=1400):
y = highpass_filter(y, sr)
onset_frames = librosa.onset.onset_detect(y=y, sr=sr)
pitches, magnitudes = librosa.piptrack(y=y, sr=sr, fmin=fmin, fmax=fmax)
notes = []
for i in range(0, len(onset_frames)):
onset = onset_frames[i] + onset_offset
index = magnitudes[:, onset].argmax()
pitch = pitches[index, onset]
if (pitch != 0):
notes.append(librosa.hz_to_note(pitch))
return notes
def highpass_filter(y, sr):
filter_stop_freq = 70 # Hz
filter_pass_freq = 100 # Hz
filter_order = 1001
# High-pass filter
nyquist_rate = sr / …Run Code Online (Sandbox Code Playgroud) python signal-processing pitch-tracking librosa onset-detection
我已经为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
是否有任何自由软件工具或组合可以让我识别录制的歌唱会话的音高?
这个想法是用时间线中的当前音高显示某种图形,以及标准音符(C3,C#3,D等)的标记.我不需要音调校正,也不需要它实时完成.
我知道,一旦Rosegarden有一个插件可以做到这一点,但它已经失踪了.
我试图做一些笔记识别mp3或wav文件.
问题是:如何在文件上使用FFT?
我更喜欢Java解决方案,但我很想提出建议.
我已经做了很多谷歌搜索,但还没有找到一个关于如何确定 mp3 文件音符的例子。
到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,从中可以计算音频文件的音高,并根据音高符号可以得出音符。
但是后来我读到mp3 文件格式在时域中,由于有损压缩格式不包含频率分析所需的样本值……这是否意味着您必须将 mp3 转换为 wav文件以计算密钥?
我找到了几个用于视觉目的的实时音高检测示例,但不是用于分析整个 mp3 文件并输出音乐键。
我希望有人能指出我正确的方向。
谢谢。
我尝试在android平台上开发一个吉他游戏。
我需要进行实时音高检测以获得吉他和弦/弦的频率。
我将从麦克风获取输入,然后分析输入(输入弹奏哪种吉他弦/和弦)
我发现有两种可以使用的方法,一种是YIN,另一种是FFT。
哪种方法可以获得更好的性能和准确的结果?