什么是好的数字信号处理算法,这对吉他和弦有好处?由于快速傅里叶变换,我认为只有在吉他上演奏的单个音符才准确,而不是同时演奏的音符(即和弦).
谢谢!
我正在尝试对用户唱歌进行实时音调检测,但我遇到了很多问题.我已经尝试了很多方法,包括FFT(FFT问题(返回随机结果))和自相关(自相关音调检测返回麦克风输入的随机结果),但我似乎无法获得任何方法来给出好的结果.任何人都可以建议一种实时音高跟踪方法或如何改进我已有的方法?我似乎无法找到任何好的C/C++方法进行实时音高检测.
谢谢,
尼尔.
编辑:请注意,我已经检查过麦克风输入数据是否正确,并且当使用正弦波时,结果或多或少是正确的音高.
编辑:对不起,这是迟到的,但此刻,我通过从结果数组和每个索引中取出值,并在X轴上绘制索引和在Y轴上绘制值来显示自动相关(两者都被除以100000或其他东西,我使用OpenGL),将数据插入VST主机并使用VST插件不是我的选择.目前,它看起来像一些随机点.我正确地做了,或者你能不能指点我做一些代码或者帮助我理解如何可视化原始音频数据和自相关数据.
我有一个样本保存在DirectX的缓冲区中.这是从乐器演奏和捕捉的音符样本.如何分析样本的频率(如吉他调谐器)?我认为涉及到FFT,但我没有指向HOWTO.
我有一个儿童的iPhone应用程序正在编写,我需要能够使用Core Audio移动声音样本的音高.有没有人有任何示例代码,我可以看看这是完成的.应用程序商店中有很多音乐和游戏应用程序,所以我知道我不是第一个.但是,我找不到任何有关它的例子.
有限的资源,如较慢的CPU,代码大小和RAM,如何最好地检测音符的音高,类似于电子或软件调谐器会做什么?
我应该使用:
其他?
简而言之,我要做的是识别单个音符,在中间C到两个八度音程之上的两个八度音阶,在任何(合理的)乐器上演奏.我希望在半音的20%范围内 - 换句话说,如果用户播放太平或太尖锐,我需要区分它.但是,我不需要调整所需的准确度.
作为一个有趣的家庭研究项目的一部分,我试图找到一种方法来减少/转换一首像音频信号的嗡嗡声(我们人们在听一首歌时感知的基本旋律).在我进一步描述我对此问题的尝试之前,我想提一下,虽然我在分析图像和视频方面有很多经验,但我对音频分析还是全新的.
谷歌搜索后,我发现了一堆旋律提取算法.给定一首歌的复音音频信号(例如.wav文件),它们输出音高轨道---在每个时间点他们估计主音调(来自歌手的声音或某些旋律生成乐器)并追踪主导音乐随着时间推移.
我读了几篇论文,他们似乎计算了这首歌的短时傅立叶变换,然后对频谱图进行了一些分析,以获得并跟踪主导音调.旋律提取只是我正在尝试开发的系统中的一个组件,所以我不介意使用任何可用的算法,只要它在我的音频文件上做得不错并且代码可用.由于我是新手,我很高兴听到有关哪些算法运行良好以及我在哪里可以找到其代码的任何建议.
我发现了两种算法:
我选择Melodia作为不同音乐类型的结果看起来相当令人印象深刻.请检查以查看其结果.你听到的每首音乐的嗡嗡声基本上都是我感兴趣的.
"对于任何一首任意歌曲来说,这都是嗡嗡声的产生,我想在这个问题中帮助你".
该算法(可用作鞋面插件)输出音高轨道--- [time_stamp,pitch/frequency] --- Nx2矩阵,其中第一列是时间戳(以秒为单位),第二列是主音调检测到相应的时间戳.下面显示的是从用紫色覆盖的算法获得的音高轨迹的可视化,其中歌曲的时域信号(上图)和频谱图/短时间 - 傅立叶.音调/频率的负值表示非浊音/非旋律片段的算法主导音调估计.因此,所有音高估计> = 0对应于旋律,其余对我来说并不重要.

现在我想将这个音轨转换回类似音频信号的嗡嗡声 - 正如作者在他们的网站上所说的那样.
下面是我写的MATLAB函数:
function [melSignal] = melody2audio(melody, varargin)
% melSignal = melody2audio(melody, Fs, synthtype)
% melSignal = melody2audio(melody, Fs)
% melSignal = melody2audio(melody)
%
% Convert melody/pitch-track to a time-domain signal
%
% Inputs:
%
% melody - [time-stamp, dominant-frequency]
% an Nx2 matrix with time-stamp in the
% first column and the detected dominant
% frequency at corresponding time-stamp
% …Run Code Online (Sandbox Code Playgroud) python matlab signal-processing pitch-tracking audio-analysis
在印度的IIT-Bombay有这个技术节,在那里他们有一个名为"Artbots"的活动,我们应该设计具有艺术能力的艺术机器人.我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放.我需要一些方法来帮助我计算歌曲音符的音高.关于如何去做的任何想法/建议?
我正在使用此算法来检测此音频文件的音高 .正如您所听到的,它是在吉他上播放的E2音符,背景中有一点噪音.
我正在使用上面链接的算法,如下所示:
y, sr = librosa.load(filename, sr=40000)
pitches, magnitudes = librosa.core.piptrack(y=y, sr=sr, fmin=75, fmax=1600)
np.set_printoptions(threshold=np.nan)
print pitches[np.nonzero(pitches)]
Run Code Online (Sandbox Code Playgroud)
结果,我fmin和我之间几乎可以获得所有可能的频率fmax.我该如何处理piptrack方法的输出以发现时间范围的基本频率?
UPDATE
不过,我仍然不确定这些2D数组代表什么.假设我想知道第5帧中82Hz的强度.我可以使用STFT函数来做到这一点,它只返回一个2D矩阵(用于绘制频谱图).
但是,piptrack做一些额外的事情可能是有用的,我真的不明白什么.pitches[f, t] contains instantaneous frequency at bin f, time t.这是否意味着,如果我想在时间帧t找到最大频率,我必须:
magnitudes[][t]数组,找到具有最大幅度的bin.f.pitches[b][t]找到属于该bin的频率?我熟悉计算机视觉(嗯,知道它),其中一个应用程序可以是图像识别,例如光学字符识别,我相信.然而,我更感兴趣的是"计算机监听",我刚学到的东西被认为是数字信号处理.
对信号处理最感兴趣的是音乐中的潜在应用.我记得不久之前我看到了一个应用程序的预览(抱歉,忘记了名字),它可以收听某人弹吉他的录音,并自动在时间线上用实际的音符/和弦绘制出来.使用该程序,用户可以移动它们甚至编辑它们.现在,显然这更复杂,但它是否涉及同样的事情?信号处理?我也对音乐可视化器和智能照明系统的可能应用感兴趣.
我的理解是,对MP3等压缩音频格式进行此处理不会产生与包含单独轨道的MIDI相同的结果(可能我误解了).PCM等未压缩格式会比MP3更好吗?我对声音处理一无所知,这正是我从目前读到的内容中推断的.
我已经看到这个问题有很好的答案和链接,涵盖了我的很多问题.但是,我发现的大多数链接都是理论上的,我确信这些链接都很有趣,鉴于我对这个主题的兴趣,我绝对值得一读.但我想知道是否有任何现有的库可以促进这一点,或者与该主题相关的文章,这些文章面向计算机科学/编程,可能还有示例代码.即使是开源声音/音乐可视化器或任何其他开源声音处理代码也会很棒.
对不起,如果我没有任何意义.就像我说的,我不知道我在说什么.
我试图找到一种方法来比较使用不同仪器上播放的相同音符的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)它也可能是相位,甚至是总振幅.
在比较这些复杂波形的谐波泛音的比例时,有没有人知道更好的明确方法?
还是我吠叫错了树?