Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回声/延迟算法只会导致噪音/静电?_Java_Audio_Signal Processing - Fatal编程技术网

Java 回声/延迟算法只会导致噪音/静电?

Java 回声/延迟算法只会导致噪音/静电?,java,audio,signal-processing,Java,Audio,Signal Processing,该网站上还有其他问题,建议您只需添加一个音频样本和一个存储的过去音频样本,即可产生回声或延迟效果。因此,我有以下Java类: public class DelayAMod extends AudioMod { private int delay = 500; private float decay = 0.1f; private boolean feedback = false; private int delaySamples; private short[] samples; priva

该网站上还有其他问题,建议您只需添加一个音频样本和一个存储的过去音频样本,即可产生回声或延迟效果。因此,我有以下Java类:

public class DelayAMod extends AudioMod {

private int delay = 500;
private float decay = 0.1f;
private boolean feedback = false;

private int delaySamples;
private short[] samples;
private int rrPointer;

@Override
public void init() {
    this.setDelay(this.delay);
    this.samples = new short[44100];
    this.rrPointer = 0;
}

public void setDecay(final float decay) {
    this.decay = Math.max(0.0f, Math.min(decay, 0.99f));
}

public void setDelay(final int msDelay) {
    this.delay = msDelay;
    this.delaySamples = 44100 / (1000/this.delay);
    System.out.println("Delay samples:"+this.delaySamples);
}

@Override
public short process(short sample) {
    System.out.println("Got:"+sample);
    if (this.feedback) {
        //Delay should feed back into the loop:
        sample = (this.samples[this.rrPointer] = this.apply(sample));
    } else {
        //No feedback - store base data, then add echo:
        this.samples[this.rrPointer] = sample;
        sample = this.apply(sample);
    }
    ++this.rrPointer;
    if (this.rrPointer >= this.samples.length) {
        this.rrPointer = 0;
    }
    System.out.println("Returning:"+sample);
    return sample;
}

private short apply(short sample) {
    int loc = this.rrPointer - this.delaySamples;
    if (loc < 0) {
        loc += this.samples.length;
    }
    System.out.println("Found:"+this.samples[loc]+" at "+loc);
    System.out.println("Adding:"+(this.samples[loc] * this.decay));
    return (short)Math.max(Short.MIN_VALUE, Math.min(sample + (int)(this.samples[loc] * this.decay), (int)Short.MAX_VALUE));
}
}
public类DelayAMod扩展AudioMod{
专用int延迟=500;
专用浮子衰减=0.1f;
私有布尔反馈=假;
私人样品;
私人短期[]样本;
私有指针;
@凌驾
公共void init(){
this.setDelay(this.delay);
this.samples=新短[44100];
这个.rrPointer=0;
}
公共无效设置衰减(最终浮点衰减){
this.decage=Math.max(0.0f,Math.min(decage,0.99f));
}
公共无效设置延迟(最终整数延迟){
this.delay=msDelay;
this.delaySamples=44100/(1000/此延迟);
System.out.println(“延迟样本:+this.delaySamples”);
}
@凌驾
公共短流程(短样本){
System.out.println(“Got:+样本”);
如果(这是反馈){
//延迟应反馈到循环中:
sample=(this.samples[this.rrPointer]=this.apply(sample));
}否则{
//无反馈-存储基本数据,然后添加回显:
this.samples[this.rrPointer]=sample;
样本=此。应用(样本);
}
++这个.rr指针;
if(this.rrPointer>=this.samples.length){
这个.rrPointer=0;
}
System.out.println(“返回:+样本”);
返回样品;
}
私人短申请(短样本){
int loc=this.rrPointer-this.delaySamples;
如果(loc<0){
loc+=此.samples.length;
}
System.out.println(“发现:“+this.samples[loc]+”位于“+loc”);
System.out.println(“添加:”+(this.samples[loc]*this.decation));
返回(short)Math.max(short.MIN_值,Math.MIN(sample+(int)(this.samples[loc]*this.decation),(int)short.max_值);
}
}
它从输入流一次接受一个16位的样本,找到一个较早的样本,并相应地将它们相加。然而,输出只是可怕的噪声静态,特别是当衰减提高到实际会导致任何可感知结果的水平时。将衰减降低到0.01几乎不允许原始音频通过,但在这一点上肯定没有回声

基本故障排除事实:

  • 如果跳过此处理,音频流听起来很好
  • 如果衰减为0(无需添加),音频流听起来很好
  • 存储的样本确实以正确的顺序和正确的位置存储和访问
  • 存储的样本正在衰减并正确添加到输入样本中
  • 从调用
    process()
    return sample
    的所有数字正是我从这个算法中所期望的,即使在这个类之外也是如此
问题似乎来自于简单地将符号短路加在一起,产生的波形是一场绝对的灾难。我看到了这种在不同的地方实现的具体方法——C,C,C++,甚至在微控制器上——为什么它在这里这么难? 编辑:看来我完全错了。我不知道是FFmpeg/avconv还是其他因素,但我在这里使用的不是正常的PCM信号。通过绘制波形图,以及对音调发生器的失败尝试和结果分析,我确定这是差分脉冲编码调制的某个版本;音高是由从一个样本到下一个样本的变化决定的,在纯正弦波上将预期的“体积”倍增器减半实际上会降低音高并使体积保持不变。(在非正弦序列上混用音量倍增器会产生与此回波算法相同的静态效果。)由于此算法和其他DSP算法旨在处理线性脉冲编码调制,因此我需要一些方法来首先获得正确的音频流。

除非有明显的剪辑,否则它肯定会工作

例如,有两列。最左边的列是16位输入。第二列是第一列和延迟4001个样本的版本的总和。采样率为22KHz

第二列中的每个样本都是x[k]和x[k-4001]相加的结果(例如y[5000]=x[5000]+x[999]=-13840+9181=-4659)。播放第二列中的样本时,您可以清晰地听到回波信号


用你的代码试试这个信号,看看是否得到相同的结果。

你说“这个问题似乎是因为简单地把有符号的短路加在一起而产生的,结果是一个绝对的灾难。”但你也说“来自进程调用()的所有数字”返回样本正是我从这个算法中所期望的,即使在这个类之外也是如此?也许你可以发布脉冲的输出。@Bjorn好吧,假设我有一个
-3672
的样本。10毫秒前,它是
1912
,乘以
0.1
就是
191
。返回的值将是
-3481
。从数字上看,它完全符合我的预期。但是听到声音,通过分析仪观察波形,很明显“正确”的数字并没有产生“正确”的声音。因此,简单的补偿加法显然是行不通的。