首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用另一种方法控制红噪声发生器(火箭发动机效应-减法合成声)

如何用另一种方法控制红噪声发生器(火箭发动机效应-减法合成声)
EN

Stack Overflow用户
提问于 2015-05-21 07:52:53
回答 1查看 202关注 0票数 1

我正在用Java编写一些声音效果,并将它们导出到.wav文件中。目前,我正在尝试编程火箭发动机的声音效果。我想以以下方式做这件事:

火箭发动机的声音可与由第二红噪声发生器控制的红噪声发生器合成。第二发生器的参数是插值样本数,影响产生的噪声的光谱含量。为了模拟声强的变化(例如在发射期间),应该使用包络发生器。

我想知道如何做到这一点,例如一个信号控制另一个信号意味着什么?也许这部分是在解释,但我现在不知道该怎么做:

第二发生器的参数是插值样本数,影响产生的噪声的光谱含量。

是关于这个参数,它描述了在创建红色噪声时,从白噪声中取了多少值并进行线性内插?(请参阅下面我的简单图表解释这个过程)

我有一个红色噪声发生器,它返回一个双倍数组,其值介于-1和1之间(它是从描述的白噪声生成的)。我现在该怎么办?我如何控制第二个红色噪音?我想这并不意味着我应该控制第二个信号的振幅。是吗?获得火箭发动机声音效果所需步骤的方案附在下面。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-27 12:32:12

我已经解决了这个问题:我有一个白色噪音产生了一个双倍阵列:

代码语言:javascript
复制
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;
}

我从白噪声中获得红色噪音的方法如下:

代码语言:javascript
复制
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。根据连续样本的值,用不同的采样值作为插值数参数来改变这种红噪声。这样就获得了火箭的声音效应。

代码语言:javascript
复制
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;
    }

使用下面的代码,带有噪声的数组将发生某种改变,即从interpolationNumber开始插入样本的“startingIndex”。

代码语言:javascript
复制
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

为了发挥火箭飞行的效果,可以使用一个包络发生器。它可以实现为简单的乘法从所描述的方法得到的样本以这样的方式,它将逐渐被抑制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30367724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档