当前位置: 首页 > 知识库问答 >
问题:

Android-检测原始版本之间的差异。wav文件和过滤。wav文件

杨飞语
2023-03-14

我有原创的。左右声道18kHz和19kHz频率的wav文件。

我还有一个问题。wav文件,使用带通滤波器的IIR滤波器过滤18kHz-20kHz。

如何检测两者之间的差异?如中所述,如何检查正在使用过滤器实现的音频是否被成功过滤?

我正在使用我找到的图书馆https://github.com/ddf/Minim/blob/master/src/ddf/minim/effects/BandPass.java https://github.com/DASAR/Minim-Android/blob/master/src/ddf/minim/effects/IIRFilter.java

以下是与过滤相关的代码。

float[][] deinterleaveData(float[] samples, int numChannels) {
    // assert(samples.length() % numChannels == 0);
    int numFrames = samples.length / numChannels;

    float[][] result = new float[numChannels][];
    for (int ch = 0; ch < numChannels; ch++) {
        result[ch] = new float[numFrames];
        for (int i = 0; i < numFrames; i++) {
            result[ch][i] = samples[numChannels * i + ch];
        }
    }
    return result;
}


float[] interleaveData(float[][] data) {
      int numChannels = data.length;
      int numFrames   = data[0].length;

      float[] result = new float[numFrames*numChannels];
      for (int i = 0; i < numFrames; i++) {
        for (int ch = 0; ch < numChannels; ch++) {
          result[numChannels * i + ch] = data[ch][i];
        }
      }
      return result;
    }

/**
  * Convert byte[] raw audio to 16 bit int format.
  * @param rawdata
  */
private int[] byteToShort(byte[] rawdata) {
  int[] converted = new int[rawdata.length / 2];

  for (int i = 0; i < converted.length; i++) {
    // Wave file data are stored in little-endian order
    int lo = rawdata[2*i];
    int hi = rawdata[2*i+1];
    converted[i] = ((hi&0xFF)<<8) | (lo&0xFF);
  }
  return converted;
}

private float[] byteToFloat(byte[] audio) {
  return shortToFloat(byteToShort(audio));
}

/**
* Convert int[] audio to 32 bit float format.
* From [-32768,32768] to [-1,1] 
* @param audio
*/
private float[] shortToFloat(int[] audio) {
    float[] converted = new float[audio.length];

    for (int i = 0; i < converted.length; i++) {
        // [-32768,32768] -> [-1,1]
        converted[i] = audio[i] / 32768f; /* default range for Android PCM audio buffers) */
    }

    return converted;
}

private void writeAudioDataToFile() throws IOException {
    int read = 0;
    byte data[] = new byte[bufferSize];
    String filename = getTempFilename();
    FileOutputStream os = null;
    FileOutputStream rs = null;
    try {
        os = new FileOutputStream(filename);
        rs = new FileOutputStream(getFilename().split(".wav")[0] + ".txt");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (null != os) {

        BandPass bandpass = new BandPass(19000,2000,44100);
        while (isRecording) {

            // decode and deinterleave stereo 16-bit per sample data
              float[][] signals = deinterleaveData(byteToFloat(data), 2);

              // filter data samples, updating the buffers with the filtered samples.
              bandpass.process(signals[0], signals[1]);

              // recombine signals for playback
              audioTrack.write(interleaveData(signals), 0, count, WRITE_NON_BLOCKING);
             // audioTrack.write(data, 0, count);   

                 read = recorder.read(data, 0, bufferSize);

            if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                try {
                    os.write(data);
                    rs.write(data);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            os.close();
            rs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如有必要,完整代码如下:http://pastebin.com/23aS2A2w

我是否找到了原著的巅峰和低谷。wav文件和过滤后的文件。检测差异的wav文件?如果没有,我将如何检测?

感谢所有回复和帮助。非常感谢!

共有1个答案

秦凯旋
2023-03-14

有几种技术可以用于测量滤波器的频率响应。

第一种方法是使用不同频率的纯正弦波运行滤波器,然后测量输出的振幅。例如,以1kHz的频率生成峰值振幅为1.0的音调,然后运行滤波器。然后看看输出。如果输出是振幅的一半,那么你可以说滤波器在1kHz时有6dB的衰减。如果你这样做的频率足够多,你可以绘制一个频率响应图,频率在x轴上,输出电平在y轴上。不过,这是一种相当粗糙的方法,需要很多要点才能获得细节。此外,在改变频率后,你需要跳过一些输出,以避免看到瞬变。

另一种方法是测量滤波器的脉冲响应。你可以通过输入一个信号来做到这一点,这个信号后面有一个1.0,其余的零。对脉冲响应进行快速傅立叶变换会得到频率响应。不过,你需要小心,给滤波器提供足够的样本,让脉冲消失。你可以通过观察输出样本并确定样本何时衰减到零来解决这个问题。

 类似资料:
  • 问题内容: 我有一个几分钟的.wav文件,我想分割成10秒的另一个.wav文件。 到目前为止,这是我的python代码: 印刷产量: 我知道这是框架列表。我如何为该列表中的每个元素制作一个wav文件(第一个.wav文件将是?Python的模块尚不清楚如何使用框架创建.wav文件。 编辑:这是一个重复的问题,如何在python中将音频文件(wav格式)拼接为1秒拼接? 但是,如果某人的答案不需要,我

  • 我正在尝试使用Eclipse、Java、Selenium、Cucumber和Appium测试apk文件。 在Windows环境变量中,在系统变量下,我将JAVA\u HOME的值设置为“C:\Program Files\JAVA\jdk-15.0.2”。 在Eclipse中,我在运行配置中使用了最新的JDK 15.0.2。当我执行cucumber测试时,我得到以下错误: C: \Users\x\A

  • 我正在尝试使用aws转录转换一个wav文件到文本。我已经向S3上传了一个wav文件,该文件位于此处,具有公共读/写权限:https://S3.us-east-1.amazonaws.com/csld8xmsdksdf8s9sk3mmdjsdifkjksdijsldk/transbe2.wav。wav文件有效。我可以在浏览器中下载并重播它(听起来像原始录音),所以我认为我们可以排除无效的输入文件、文

  • 问题内容: 我正在用Java 做辫子。如果倒带时间,声音会向后播放。如何向后播放WAV文件?也许有像这样的流?在Braid网站上,您可以看到我的意思。 更新: _ 解决! 看到我自己的帖子。_ 问题答案: !!!!!! 我自己解决了这个问题(14岁!!), 我写了这个课: 然后:

  • 问题内容: 我想阅读Java中的wav文件,我将使用K-means对它们进行分类。 如何读取Java中的wav文件并将其分配到数组或类似的内容(您可以提出想法)中以对其进行分类? 编辑: 我想使用API​​读取wav文件和K-均值。 问题答案: 官方的Java声音编程指南走过读取和写入的音频文件。 A Greensted 撰写的本文:用Java读写Wav文件应该会有所帮助。WavFile类非常有用

  • null msg有什么能力而eml没有,反之亦然?