我搜索了如何执行此操作的页面,并找到了 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);
}
}
在
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);
}