- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
还有其他问题and answers在这个站点上建议,要创建回声或延迟效果,您只需添加一个音频样本以及过去存储的音频样本。因此,我有以下 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));
}
}
它一次从输入流中接受一个 16 位样本,找到一个较早的样本,并相应地将它们相加。然而,输出只是可怕的嘈杂静态,尤其是当衰减提高到实际上会导致任何明显结果的水平时。将衰减降低到 0.01 几乎无法让原始音频通过,但此时肯定没有回声。
基本故障排除事实:
process()
到 return sample
的所有数字正是我对这个算法的期望,即使在这个类之外也是如此。问题似乎是由简单地将带符号的短裤加在一起引起的,由此产生的波形绝对是一场灾难。我已经在很多地方看到过这个特定的方法——C#、C++,甚至在微 Controller 上——那么为什么它在这里如此失败呢?
编辑: 看来我的做法完全错了。我不知道是 FFmpeg/avconv 还是其他因素,但我不在这里使用正常的 PCM 信号。通过波形图,以及对音调发生器的失败尝试和结果分析,我确定这是某种版本的差分脉冲编码调制;音调由一个样本到下一个样本的变化决定,将纯正弦波上的预期“音量”乘数减半实际上会降低音调并使音量保持不变。 (在非正弦序列上弄乱音量乘法器会产生与此回声算法相同的静态。)由于此算法和其他 DSP 算法旨在用于线性脉冲编码调制,我将需要一些方法来首先获得正确的音频流。
最佳答案
它应该绝对有效除非你有明显的剪裁。
例如,this is a text file有两列。最左边的列是 16 位输入。第二列是第一列和延迟了 4001 个样本的版本的总和。采样率为22KHz。
第二列中的每个样本都是 x[k] 和 x[k-4001] 求和的结果(例如 y[5000] = x[5000] + x[999] = -13840 + 9181 = -4659)播放第二列样本时可以清楚地听到回声信号。
用你的代码试试这个信号,看看你是否得到相同的结果。
关于java - 回声/延迟算法只会导致噪音/静电?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16439322/
还有其他问题and answers在这个站点上建议,要创建回声或延迟效果,您只需添加一个音频样本以及过去存储的音频样本。因此,我有以下 Java 类: public class DelayAMod e
我是一名优秀的程序员,十分优秀!