我想将声音的音高绘制成图形.
目前我可以绘制幅度.下图是由返回的数据创建的getUnscaledAmplitude():

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file)));
byte[] bytes = new byte[(int) (audioInputStream.getFrameLength()) * (audioInputStream.getFormat().getFrameSize())];
audioInputStream.read(bytes);
// Get amplitude values for each audio channel in an array.
graphData = type.getUnscaledAmplitude(bytes, 1);
public int[][] getUnscaledAmplitude(byte[] eightBitByteArray, int nbChannels)
{
int[][] toReturn = new int[nbChannels][eightBitByteArray.length / (2 * nbChannels)];
int index = 0;
for (int audioByte = 0; audioByte < eightBitByteArray.length;)
{
for (int channel = 0; channel < nbChannels; channel++)
{
// Do the byte to sample conversion. …Run Code Online (Sandbox Code Playgroud) 我有一把吉他,我需要我的电脑能够分辨正在播放的音符,识别音调.是否有可能在python中执行它,也可以使用pygame吗?能够在pygame中执行它将非常有帮助.
我正在尝试使用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
我正在研究音频调谐器应用程序以调整乐器.用户应该播放一个音符,然后在我的应用程序中,我应该显示它有哪个频率.
首先,我应该访问麦克风?
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
Run Code Online (Sandbox Code Playgroud)
然后我需要计算声音的频率.我怎样才能做到这一点?
我想要检测的不是音高,而是发出唱音的音高等级.
因此,无论是C4还是C5都不重要:它们必须都被检测为C.
想象一下,12个半音安排在钟面上,针指向音高等级.这就是我追求的!理想情况下,我希望能够分辨出唱歌音符是点亮还是稍微偏离.
这与先前提出的问题不重复,因为它引入了以下约束条件:
声源是一个人的声音,希望背景干扰可以忽略不计(虽然我可能需要处理这个问题)
八度音阶并不重要,只有音高等级
编辑 - 链接:
实时音高检测
使用Apple FFT和加速框架
我有这个代码,但它会随机返回0到1050左右的随机频率.请你帮我理解为什么会这样.
我的数据长度为1024,采样率为8192,数据是一个填充了麦克风输入数据的短阵列.
float *iSignal = new float[2048];
float *oSignal = new float[2048];
int pitch = 0;
for(x=0;x<=1024;x++) {
iSignal[x] = data[x];
}
fft(iSignal,oSignal,1024); //Input data, output data, length of input and output data
for(int y=0;y< 2048;y+=2) {
if((pow(oSignal[y],2)+pow(oSignal[y+1],2))>(pow(oSignal[pitch],2)+pow(oSignal[(pitch)+1],2))) {
pitch = y;
}
}
double pitchF = pitch / (8192.0/1024);
printf("Pitch: %f\n",pitchF);
Run Code Online (Sandbox Code Playgroud)
谢谢,
尼尔.
编辑:更改了代码,但它仍然返回随机频率.