如何用另一个控制红噪声发生器(火箭发动机效果-声音的减法合成)
How to control red noise generator by another one (Rocket engine effect - Subtractive synthesis of sound)
我正在 Java 中编写一些音效并将它们导出到 .wav 文件中。目前,我正在尝试编写火箭发动机音效。我想通过以下方式进行:
火箭发动机的声音可能是由第二个红噪声发生器控制的红噪声发生器合成的。由第二个生成器修改的第一个生成器的参数是插值样本的数量,影响生成的噪声的频谱内容。为了模拟声音强度的变化(例如在发射期间),应该使用包络发生器。
我想知道怎么做,例如一个信号控制另一个信号是什么意思。可能这部分正在解释它,但我不知道现在该做什么:
The parameter of the first generator modified by the second one is the
number of interpolated samples, influencing the spectral content of
the generated noise.
这个参数是否描述了在创建红噪声时从白噪声中获取多少值并进行线性插值? (请参阅下面解释此过程的我的简单绘图)
我有一个红噪声发生器,它 returns 一个双精度数组,值在 -1 和 1 之间(它是根据描述的白噪声生成的)。我现在该怎么办?我怎样才能控制第二个红噪声?我想这并不意味着我应该控制第二个信号的幅度。可以?下面附有获得火箭发动机音效所需的步骤示意图。
我已经解决了这个问题:
我有一个双打数组生成的白噪声:
public static double[] whiteNoise(int length) {
double[] out = new double[length];
for (int i = 0; i < length; i++) {
out[i] = (Math.random() * 2 - 1.0)/2.0;
}
return out;
}
我通过以下方式从白噪声中提取红噪声:
public static double[] redNoise(int length, int m) {
double out[] = whiteNoise(length);
for (int i=0; i<length/m-1; i++) {
int k = i*m;
int l = ((i+1)*m <= length-1) ? (i+1)*m : length-1;
double d = (out[l] - out[k])/((double)(m));
for (int j=0; j<m; j++) {
out[k+j] = out[k] + d*j;
}
}
return out;
}
其中 m 参数是插值样本的数量(我们取第一个样本和第 m+1 个样本,并在这两个样本之间插值所有样本的值)。
演出开始
我生成插值数等于 10000 的红噪声。根据连续样本的值,我用从这些样本中获得的不同值作为插值数参数来更改此红噪声。这样就得到了一个火箭音效
int interpolatedframes = 10000;
double[] rednoise1 = SigGen.redNoise(duration, interpolatedframes);
while(i<rednoise1.length-1)
{
selectedNumber = (int)Math.floor(Math.abs((100*(rednoise1[i]+0.5)+100)));
if(i+selectedNumber < rednoise1.length-1) {
rednoise1 = SigGen.alterRedNoise(rednoise1, i, selectedNumber);
}
else
{
break;
}
i+=selectedNumber;
}
使用以下代码,带有噪声的数组在某种程度上被改变,它从 startingIndex 开始插入 "interpolationNumber" 个样本。
public static double[] alterRedNoise(double[] input, int startIndex, int interpolationNumber)
{
int k = startIndex;
int l = ((startIndex + interpolationNumber)<input.length-1?(startIndex+interpolationNumber):input.length-1);
double d = (input[l] - input[k])/((double)(interpolationNumber));
for (int j=0; j<interpolationNumber; j++) {
input[k+j] = input[k] + d*j;
}
return input;
}
抱歉,代码有点乱,但我只想尽快发布它。
#编辑 1
应该发出的声音是火箭发射的声音。看看这部电影(可能来自1:45):https://www.youtube.com/watch?v=OnoNITE-CLc
要产生火箭飞过的效果,可以使用包络发生器。它可以作为从所描述的方法中获得的样本的简单乘法来实现,这样它将逐渐被抑制。
我正在 Java 中编写一些音效并将它们导出到 .wav 文件中。目前,我正在尝试编写火箭发动机音效。我想通过以下方式进行:
火箭发动机的声音可能是由第二个红噪声发生器控制的红噪声发生器合成的。由第二个生成器修改的第一个生成器的参数是插值样本的数量,影响生成的噪声的频谱内容。为了模拟声音强度的变化(例如在发射期间),应该使用包络发生器。
我想知道怎么做,例如一个信号控制另一个信号是什么意思。可能这部分正在解释它,但我不知道现在该做什么:
The parameter of the first generator modified by the second one is the number of interpolated samples, influencing the spectral content of the generated noise.
这个参数是否描述了在创建红噪声时从白噪声中获取多少值并进行线性插值? (请参阅下面解释此过程的我的简单绘图)
我有一个红噪声发生器,它 returns 一个双精度数组,值在 -1 和 1 之间(它是根据描述的白噪声生成的)。我现在该怎么办?我怎样才能控制第二个红噪声?我想这并不意味着我应该控制第二个信号的幅度。可以?下面附有获得火箭发动机音效所需的步骤示意图。
我已经解决了这个问题: 我有一个双打数组生成的白噪声:
public static double[] whiteNoise(int length) {
double[] out = new double[length];
for (int i = 0; i < length; i++) {
out[i] = (Math.random() * 2 - 1.0)/2.0;
}
return out;
}
我通过以下方式从白噪声中提取红噪声:
public static double[] redNoise(int length, int m) {
double out[] = whiteNoise(length);
for (int i=0; i<length/m-1; i++) {
int k = i*m;
int l = ((i+1)*m <= length-1) ? (i+1)*m : length-1;
double d = (out[l] - out[k])/((double)(m));
for (int j=0; j<m; j++) {
out[k+j] = out[k] + d*j;
}
}
return out;
}
其中 m 参数是插值样本的数量(我们取第一个样本和第 m+1 个样本,并在这两个样本之间插值所有样本的值)。
演出开始
我生成插值数等于 10000 的红噪声。根据连续样本的值,我用从这些样本中获得的不同值作为插值数参数来更改此红噪声。这样就得到了一个火箭音效
int interpolatedframes = 10000;
double[] rednoise1 = SigGen.redNoise(duration, interpolatedframes);
while(i<rednoise1.length-1)
{
selectedNumber = (int)Math.floor(Math.abs((100*(rednoise1[i]+0.5)+100)));
if(i+selectedNumber < rednoise1.length-1) {
rednoise1 = SigGen.alterRedNoise(rednoise1, i, selectedNumber);
}
else
{
break;
}
i+=selectedNumber;
}
使用以下代码,带有噪声的数组在某种程度上被改变,它从 startingIndex 开始插入 "interpolationNumber" 个样本。
public static double[] alterRedNoise(double[] input, int startIndex, int interpolationNumber)
{
int k = startIndex;
int l = ((startIndex + interpolationNumber)<input.length-1?(startIndex+interpolationNumber):input.length-1);
double d = (input[l] - input[k])/((double)(interpolationNumber));
for (int j=0; j<interpolationNumber; j++) {
input[k+j] = input[k] + d*j;
}
return input;
}
抱歉,代码有点乱,但我只想尽快发布它。
#编辑 1
应该发出的声音是火箭发射的声音。看看这部电影(可能来自1:45):https://www.youtube.com/watch?v=OnoNITE-CLc
要产生火箭飞过的效果,可以使用包络发生器。它可以作为从所描述的方法中获得的样本的简单乘法来实现,这样它将逐渐被抑制。