2017-08-04 71 views
1

所以在下面的程序中,它的速度的音频文件,并使它听起来好像人有“氦声音”。这是通过改变索引值来完成的,而当你增加索引值时,文件的音高和速度会更快。我想知道是否有办法做相反的事情,并且让音频播放更慢,声音更深。放慢声音速度

public void helium(String sourceFile, String targetFile) 
{ 
    Sound sourceObj = new Sound(sourceFile);        
    Sound target = new Sound(targetFile); 
    int sampleValue = 0;            
    int targetIndex = 0;             

    for(int index = 0; index < sourceObj.getLength(); index+=2) 
    { 
     sampleValue = sourceObj.getSampleValueAt(index);      
     target.setSampleValueAt(targetIndex,sampleValue);     
     targetIndex++;              
    } 
    target.play(); 

} 
+0

使用负值? – Tavo

+0

如果你把索引的负值,它只会导致错误 –

+0

如果你增加1并使用'索引/ 2'会怎么样? – shmosel

回答

1

而不是将样品的大小减半,样品的大小加倍,并使用每个值两次。我相信有更先进的方法,但这会使波形慢两倍,导致低音。

我有,因为你使用了一些非标准的声音API是我不熟悉的作出一些假设。为了确保您的声音是不是太渴望你的目标样本,我现在限制在源索引到目标一半样品的最大尺寸(index < target.getLength()/2

int sampleValue = 0;            
int targetIndex = 0;             

for(int index = 0; index < target.getLength()/2; index++) 
{ 
    sampleValue = sourceObj.getSampleValueAt(index);      
    target.setSampleValueAt(targetIndex, sampleValue); 
    target.setSampleValueAt(targetIndex + 1, sampleValue);     
    targetIndex += 2;              
} 
+0

对不起,我对Java很陌生,但是当我将代码更改为您所写的内容时,它创建了一个错误,指出“该索引443904不存在,最后一个有效索引是443903”。我很抱歉,但我真的不知道这意味着什么,如果你可以改变代码或为我解释。 –

+0

@DannyM更新了答案。请参阅“为了确保您的声音对于目标样本不太长,我现在将源中的索引限制为目标样本的最大大小的一半('index

+0

谢谢你的诀窍。如果你不介意我问,你知道为什么我上面说的错误发生了。 (对不起,我很新的节目) –

0

简易方法将翻番每个样品。

一种不太幼稚的方法是分裂的样品之间(线性插值)的差异。

正确的做法是在每个采样之间插入零,然后应用该拒绝采样速率一半以上的任何信号的低通滤波器。看到https://en.wikipedia.org/wiki/Upsampling