如何使用 Double [] 数组对 Java 中的音频进行低通和高通滤波器

问题描述 投票:0回答:1

我搜索了如何执行此操作的页面,并找到了 C 代码,但没有找到 java 代码。

C 示例:https://kiritchatterjee.wordpress.com/2014/11/10/a-simple-digital-low-pass-filter-in-c/

上面的这个链接没有提到数组,因为它们可能会这样做,例如音频通过麦克风流式传输,我不希望这样做,我希望低通或高通一段音频然后保存低/高通过的结果。

注意:我只是在数组旁边添加 [] 以使阅读者的解释更加清晰

本质上我想做的是以下几点:

  • 使用java代码读取.wav文件

  • 将 .wav 数据转换为 double [] 数组(通过使用 StdAudio 库将 byte [] 数组转换为 double [] 数组)

  • 从那里我想高通/低通音频数据 - 将其应用到双 [] 数组

  • 一旦将高通或低通应用于双 [] 数组,那么我最终将得到一个全新的双 [] 数组

for 循环中的代码出现错误:

运算符“-”不能应用于“double”、“double[]”

其他问题:

即使我没有收到错误,我实际上也不知道 for 循环中的代码是否会低通音频。

代码:

import StdAudio.*; 

public class PassAudio
{

public static int RawData;
public static double SmoothData;
public static double LPF_Beta = 0.025; // 0<ß<1

    public static void main(String[] args) 
    {
        //read the file and convert it to a double array
        
        double[] music = 

        StdAudio.read("https://introcs.cs.princeton.edu/java/stdlib/BaseDrum.wav");
        
        double [] lowPassedAudio = new double [music.length];

        //low pass the audio
        for(int i = 0; i < music.length; i++)
        {
                //high pass/low pass the audio data
                 lowPassedAudio [i] = lowPassedAudio [i] - (LPF_Beta * 
                (lowPassedAudio [i] - music));
        }
        StdAudio.play(lowPassedAudio);                    
    }
}
java audio filter
1个回答
0
投票

lowPassedAudio[i] = lowPassedAudio[i] - (LPF_Beta * (lowPassedAudio[i] - music));
中,您尝试将整个数组 (
music
) 减去
lowPassedAudio[i]
(这是一个双精度数)。您需要索引
music

public static void main(String[] args) {
    double[] music = StdAudio.read("https://introcs.cs.princeton.edu/java/stdlib/BaseDrum.wav");

    double[] lowPassedAudio = new double[music.length];

    lowPassedAudio[0] = music[0];

    for (int i = 1; i < music.length; i++) {
        lowPassedAudio[i] = lowPassedAudio[i - 1] + LPF_Beta * (music[i] - lowPassedAudio[i - 1]);
    }

    StdAudio.play(lowPassedAudio);
}
© www.soinside.com 2019 - 2024. All rights reserved.