1

我正在尝试对样本进行音高转换。我正在使用线性插值方法。

如果音高的数量是一个整数值,则音高被干净地移动。如果音高偏移量是合理的,则声音会严重失真。该实施似乎有效。

这是我的代码,我试图很好地评论。

public void generateOutTrack()
{
    Note currNote;
    float[] output=new float[pattern.getPlayTimeInSmps()];//returns total play time of pattern in #samples.


    float[] currSample=sample.getData();//the pcm data of the sample to be used
    int currPeriod=0;//length of next note in number of samples
    int outputPtr=0;//points to next sample in output buffer array
    float pitch;//amount to pitch sample by
    float linInt=0;//linear interpolater
    float phasePtr=0;//floating point index in sample
    int ptr=0;//integer index into sample

    JavAud.checkRange(currSample);

    while((currNote=pattern.nextNote())!=null)//each iteration plays one note
    {

        currPeriod=currNote.getPeriodInSmps();//length of current note in samples
        pitch=currNote.getPitch();//pitch of current note

        for(int i=0;i<currPeriod;i++)//run for length of note
        {   
            ptr=(int)phasePtr;//floor of floating point index
            linInt=phasePtr-ptr;

            //if we are not at end of sample copy data to output
            if(ptr<currSample.length*(1/pitch)-1)
            {

                //linear interpolation pitch shifting
                output[outputPtr]=(currSample[ptr+1]*linInt)+(currSample[ptr]*(1-linInt));

                //alternate pitch shifting by simple sample dropping(has less distortion)
                //output[outputPtr]=currSample[ptr];

            }
            else//else silent
            {
                output[outputPtr]=0;
            }   

            outputPtr++;
            phasePtr=phasePtr+pitch;
        }

        phasePtr=0;

    }
    JavAud.checkRange(output);
    WavFileWriter writer = new WavFileWriter();
    writer.writeWave(new WavFile(1, JavAud.GLB_SMP_RATE, output), "outputTone.wav");

}
4

1 回答 1

2

看起来您正试图通过重新采样来进行音高转换。比线性插值进行更好质量重采样的一种常见方法是使用加窗 Sinc 低通滤波器作为插值内核。窗口 Sinc 重采样的一种(慢)方法的伪代码在这里:http ://www.nicholson.com/rhn/dsp.html#3

于 2014-02-18T04:01:10.913 回答