如何编辑音频缓冲区

Posted

技术标签:

【中文标题】如何编辑音频缓冲区【英文标题】:How can I edit an audio buffer 【发布时间】:2012-06-13 11:12:27 【问题描述】:

我创建了一个音频缓冲区,并想在播放此声音之前对其进行编辑。 我的问题是当数字大于 1 时我会发出很大的噪音。这意味着我只能 当我不编辑缓冲区(数据)时,无噪音播放缓冲区。 背景资料: data 是一个录音缓冲区,包含以下信息:

private static final String TAG = "Aufnahme";
private AudioRecord recorder = null;
private boolean isRecording = false;
private int SAMPLERATE = 44100;
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS,
        AUDIO_FORMAT);
private Thread recordingThread = null;

还有我的效果类:

public class verzerrer     
    public void distortion(short[] data)       
        output out = new output();
        long[] y = new long[data.length];
        int number =1000;

        for(int i=1;i<data.length;i++)
            y[i]=(data[i]/number)*number;       
           

        for(int i=0;i<data.length;i++)
            data[i]=(short) y[i];
        
        out.send(data);
       

【问题讨论】:

【参考方案1】:

你说“我的问题是当数字大于 1 时我会发出很大的噪音。”但在我看来,“大噪音”正是你想要创造的:你的效果被称为“失真”,当数字 > 1 时你正在执行整数除法,这会产生非常大的 IM 失真。

在我看来,您创建的效果类似于“有点粉碎”效果:丢弃最不重要的数据。如果您希望创建更传统的失真(如吉他放大器失真),则需要执行“削波”,而不是“位压碎”。像这样:

for(int i=1;i<data.length;i++)
    if( data[i] > number )
        y[i]=number;
    else if( data[i] < - number )
        y[i]=-number;       

这会产生谐波失真。数字越小,得到的失真就越大。这里,“数字”被称为“阈值”。你可能想使用类似的东西

number=(Short) ( Short.MAX_VALUE * ( 1-t ) ) ;

来定义它。这里,t 是一个浮点值。如果 t 越接近 1,失真越大,越接近 0,失真越小。

【讨论】:

感谢您的回答。问题是失真应该是下一步。首先,我只想编辑缓冲区,但我忘记了 long 不是浮点数(错误)。非常感谢

以上是关于如何编辑音频缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

播放 iOS 的远程音频缓冲区时如何避免机器人声音?

ASIO SDK如何处理音频缓冲区

如何控制(音频缓冲区)AudioContext() 的音量?

如何创建指向与 VST 音频缓冲区相同的指针数组的指针?

如何获得 3sn 的音频缓冲区 ios

如何在将音频缓冲区发送到扬声器之前获取它们?