[Android] [Kotlin]使用AudioRecord实现带通滤波器并写入16BIT PCM文件

用户名

简介:我正在尝试使用Android的AudioRecord来实现带通滤波器,并将经过滤波的音频写入PCM文件。

到目前为止,我的库尝试了什么:https : //github.com/berndporr/iirj/blob/master/src/test/java/uk/me/berndporr/iirj/ButterworthTest.java https://github.com/psambit9791 /jDSP/blob/master/src/main/java/com/github/psambit9791/jdsp/filter/Butterworth.java

结果:当查看过滤的PCM文件时,两者都将导致过滤的音频输出失真。当前使用jDSP Butterworth带通滤波器的实现。我认为我没有从ByteArray正确转换为Double,反之亦然。以下是用于此实现的主要信息。

/**
 * This constructor initialises the prerequisites
 * required to use Butterworth filter.
 * @param s Signal to be filtered
 * @param Fs Sampling frequency of input signal
 */
public Butterworth(double[] s, double Fs) {
    this.signal = s;
    this.samplingFreq = Fs;
}

/**
 * This method implements a band pass filter with given parameters, filters the signal and returns it.
 * @param order Order of the filter
 * @param lowCutoff The lower cutoff frequency for the filter in Hz
 * @param highCutoff The upper cutoff frequency for the filter in Hz
 * @throws java.lang.IllegalArgumentException The lower cutoff frequency is greater than the higher cutoff frequency
 * @return double[] Filtered signal
 */
public double[] bandPassFilter(int order, double lowCutoff, double highCutoff) throws IllegalArgumentException{
    if (lowCutoff >= highCutoff) {
        throw new IllegalArgumentException("Lower Cutoff Frequency cannot be more than the Higher Cutoff Frequency");
    }
    double centreFreq = (highCutoff + lowCutoff)/2.0;
    double width = Math.abs(highCutoff - lowCutoff);
    this.output = new double[this.signal.length];
    uk.me.berndporr.iirj.Butterworth bp = new uk.me.berndporr.iirj.Butterworth();
    bp.bandPass(order, this.samplingFreq, centreFreq, width);
    for (int i=0; i<this.output.length; i++) {
        this.output[i] = bp.filter(this.signal[i]);
    }
    return this.output;
}

private val AudioSource = MediaRecorder.AudioSource.MIC
private val SampleRate = 44100
private val Channel = AudioFormat.CHANNEL_IN_MONO
private val EncodingType = AudioFormat.ENCODING_PCM_16BIT

private var bufferSizeInByte: Int = 0

private fun writeDatatoFile() {
    var audioData = ByteArray(bufferSizeInByte)
    val file1 = UNFILTEREDPCM
    val file2 = FILTEREDPCM
    file1.createNewFile()
    file2.createNewFile()

    val out1 = BufferedOutputStream(FileOutputStream(file1))
    val out2 = BufferedOutputStream(FileOutputStream(file2))
    var length = 0

    while (isRecord && audioRecorder != null) {
        length = audioRecorder!!.read(audioData, 0, bufferSizeInByte) // get audio data
        val butterworth = Butterworth(doubleArrayOf(ByteBuffer.wrap(audioData).getDouble()),44100.0)
        val result = butterworth.bandPassFilter(2, 1525.0, 1625.0)
        if (AudioRecord.ERROR_INVALID_OPERATION != length) {
            out1.write(audioData, 0, length) // write file
            out1.flush()
            for (i in 0 until result.size) {
                val newBuffer = ByteBuffer.allocate(bufferSizeInByte).putDouble(result[i]).array()
                out2.write(newBuffer, 0, length)
            }
            out2.flush()
        }
    }
    out1.close()
    out2.close()
}
用户名

我真的想通了。使用https://github.com/JorenSix/TarsosDSP库,过滤后无需进行转换。它还包括在FFT库中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android反向播放pcm文件

来自分类Dev

Android反向播放pcm文件

来自分类Dev

如何在Android中为输入音频实现IIR带通滤波器

来自分类Dev

在Android中使用liblame将pcm文件转换为mp3

来自分类Dev

如何使用带通滤波器正确实现均衡

来自分类Dev

如何使用带通滤波器正确实现均衡

来自分类Dev

如何创建没有舍入误差的简单IIR低通滤波器?(16位pcm数据)

来自分类Dev

写入PCM数据@ 16KBps时的文件(.wav)持续时间

来自分类Dev

Android将音频转换为16位PCM

来自分类Dev

Android将音频转换为16位PCM

来自分类Dev

安卓:使用Raw PCM创建Wave文件,Wave文件无法播放

来自分类Dev

使用ffmpeg javascript将wav音频文件转换为pcm音频文件

来自分类Dev

如何使用ffmpeg的libavcodec将opus文件解码为pcm文件?

来自分类Dev

使用ffmpeg javascript将wav音频文件转换为pcm音频文件

来自分类Dev

在Android上使用OpenSL播放内存中的PCM WAVE声音

来自分类Dev

在Android上使用OpenSL播放内存中的PCM WAVE声音

来自分类Dev

带通滤波器组

来自分类Dev

如何使用.txt文件的二进制输入绘制PCM波

来自分类Dev

使用ffmpeg将PCM-ALAW数据转换为音频文件

来自分类Dev

使用ffmpeg将mpeg2文件与pcm_dvd音频合并

来自分类Dev

如何使用ffmpeg将原始PCM数据转换为有效的WAV文件?

来自分类Dev

使用ffmpeg长块将pcm文件分割成几分钟

来自分类Dev

使用 LAME 将原始 PCM 文件转换为 MP3 会返回失真的音频

来自分类Dev

Android Raw PCM压缩/编码

来自分类Dev

C ++-读取16bit .wav文件

来自分类Dev

ffmpeg说“ WAVE格式不支持pcm_f32be编解码器”,但文件已创建

来自分类Dev

使用ffmpeg API将pcm_alaw类型的音频数据包装到MKA音频文件中

来自分类Dev

python中的fft带通滤波器

来自分类Dev

CMSIS FIR带通滤波器

Related 相关文章

  1. 1

    Android反向播放pcm文件

  2. 2

    Android反向播放pcm文件

  3. 3

    如何在Android中为输入音频实现IIR带通滤波器

  4. 4

    在Android中使用liblame将pcm文件转换为mp3

  5. 5

    如何使用带通滤波器正确实现均衡

  6. 6

    如何使用带通滤波器正确实现均衡

  7. 7

    如何创建没有舍入误差的简单IIR低通滤波器?(16位pcm数据)

  8. 8

    写入PCM数据@ 16KBps时的文件(.wav)持续时间

  9. 9

    Android将音频转换为16位PCM

  10. 10

    Android将音频转换为16位PCM

  11. 11

    安卓:使用Raw PCM创建Wave文件,Wave文件无法播放

  12. 12

    使用ffmpeg javascript将wav音频文件转换为pcm音频文件

  13. 13

    如何使用ffmpeg的libavcodec将opus文件解码为pcm文件?

  14. 14

    使用ffmpeg javascript将wav音频文件转换为pcm音频文件

  15. 15

    在Android上使用OpenSL播放内存中的PCM WAVE声音

  16. 16

    在Android上使用OpenSL播放内存中的PCM WAVE声音

  17. 17

    带通滤波器组

  18. 18

    如何使用.txt文件的二进制输入绘制PCM波

  19. 19

    使用ffmpeg将PCM-ALAW数据转换为音频文件

  20. 20

    使用ffmpeg将mpeg2文件与pcm_dvd音频合并

  21. 21

    如何使用ffmpeg将原始PCM数据转换为有效的WAV文件?

  22. 22

    使用ffmpeg长块将pcm文件分割成几分钟

  23. 23

    使用 LAME 将原始 PCM 文件转换为 MP3 会返回失真的音频

  24. 24

    Android Raw PCM压缩/编码

  25. 25

    C ++-读取16bit .wav文件

  26. 26

    ffmpeg说“ WAVE格式不支持pcm_f32be编解码器”,但文件已创建

  27. 27

    使用ffmpeg API将pcm_alaw类型的音频数据包装到MKA音频文件中

  28. 28

    python中的fft带通滤波器

  29. 29

    CMSIS FIR带通滤波器

热门标签

归档