gpt4 book ai didi

android - 在Android中实现高通音频过滤器

转载 作者:行者123 更新时间:2023-12-02 22:26:51 25 4
gpt4 key购买 nike

我正在尝试对从audioRecord获得的麦克风数据实现高通音频过滤器。

我从麦克风获得的数据是一个16位PCM音频字节数组。我试图使用TarsosDSP,它提供了用于高通滤波的API。但是,作为输入它需要一个浮点数组,因此我将字节转换为一个浮点数组并运行了高通滤波器。为了确认结果,我将过滤后的数据保存在wave文件中,但听起来完全失真了。

public static byte[] highPassFilter( byte[] buffer, WaveHeader waveHeader, float frequency) {

HighPass highPass = new HighPass(frequency, waveHeader.getSampleRate());

TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(waveHeader.getSampleRate(),waveHeader.getBitsPerSample(),waveHeader.getChannels(),true, false);
AudioEvent audioEvent = new AudioEvent(format);
float[] f_buffer = bytesToFloats(buffer);
audioEvent.setFloatBuffer(f_buffer);

highPass.process(audioEvent);
buffer = audioEvent.getByteBuffer();

byte[] data = PCMtoWav(buffer, waveHeader.getSampleRate(), waveHeader.getChannels(), waveHeader.getBitsPerSample());
writeWavFile(data);

return buffer;
}

public static float[] bytesToFloats(byte[] bytes) {
float[] floats = new float[bytes.length / 2];
for(int i=0; i < bytes.length; i+=2) {
floats[i/2] = bytes[i] | (bytes[i+1] < 128 ? (bytes[i+1] << 8) : ((bytes[i+1] - 256) << 8));
}
return floats;
}
waveHeader中的数据为: Sample rate = 11025 getBitsPerSample = 16 getChannels = 1
我最好的猜测是bytesToFloats转换是错误的。为了验证这一点,我只是将 audioEvent的float缓冲区设置为 audioEvent.setFloatBuffer,然后使用 audioEvent.getByteBuffer对其进行了检索,这也导致音频文件完全失真。

从audioRecord读取字节缓冲区:
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 220500);
....
buffer = new byte[frameByteSize];
byte[] audioRecord.read(buffer, 0, frameByteSize);

任何人都有任何想法如何解决此问题,或对我可以在android中的字节数组上使用的不同高通滤波器的建议。

更新:我想通了。这是我更新后的功能,可以将字节转换为浮点数:
 public static float[] bytesToFloats(byte[] bytes) {
float[] floats = new float[bytes.length / 2];
short[] shorts = new short[bytes.length/2];
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
for(int i=0; i < bytes.length; i+=2) {
floats[i/2] = shorts[i/2] / 32768f;
}
return floats;
}

最佳答案

两个字节样本代表浮点值吗?可以在-32,768到32,767的范围内对它们进行简短签名。同样,对于样本的浮点表示,-1.0到1.0范围内的值是常见的。

我会尝试:

short sample = bytes[i] | (bytes[i+1] < 128 ? (bytes[i+1] << 8) : ((bytes[i+1] - 256) << 8));
floats[i/2] = (float)sample / 32,768f;

关于android - 在Android中实现高通音频过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com