代码之家  ›  专栏  ›  技术社区  ›  Rick T

用matlab/octave制作灰色音频噪声

  •  1
  • Rick T  · 技术社区  · 8 年前

    我可以通过选择不同的 输入范数 变量在下面使用,但如何创建灰色噪音?

    %https://en.wikipedia.org/wiki/Colors_of_noise
    
    mean_amp=mean(yamp_orig.^2); %get mean of all freq amplitudes
    amt_of_freq=size(xfreq_orig,1); %number of freq
    
    %invfnorm=1./[1:amt_of_freq]; % 1/f creates pink noise
    %invfnorm=[1:amt_of_freq]; % f creates blue noise
    invfnorm=1./[1:amt_of_freq].^2; % 1/f^2 creates brown noise
    
    amp_1f_new=sqrt(mean_amp*invfnorm/sum(invfnorm))(:); %new noise amplitudes to use
    

    在链接中 https://en.wikipedia.org/wiki/Colors_of_noise 他们给出了粉色,棕色,蓝色音频噪声的公式,但对于灰色噪声,他们只是说 “倒A加权曲线” 不显示公式,我只需要公式。 参见下面的光谱。

    Grey noise 我得到这些信息的网站在这里 grey noise

    注:我使用的是倍频程4.2.2,它与Matlab类似

    1 回复  |  直到 8 年前
        1
  •  1
  •   WoodyDev    8 年前

    如您所述,灰色噪声是通过应用逆a加权曲线创建的。

    以下代码片段是 Matlab example (感谢 W. Owen Brimijoin )产生灰色噪声:

    %values from the ISO 66-phon Equal-loudness contour (adjusted for
            %optimal spline interpolation):
            freqs = [1 5 15 36 75 138 235 376 572 835 1181 1500 2183 2874 3718 ...
                4800 5946 7377 9051 10996 13239 15808 18735 22050].*sample_rate/44100;
            dB_vals = [61 61 56 40 25 17 11 7 5 4 6 8 3 1 1 4 9 14 17 16 10 5 2 1];
    
            %create level vector for use in inverse Fourier transform:
            freq = linspace(0,sample_rate/2,floor(num_samples/2));
            spl = spline(freqs,dB_vals,freq); %upsample 
            levels = [spl,fliplr(spl)]; %reflect vector
            levels = 10.^(levels'./10); %change to power
            levels(levels==inf) = 0; %remove infinite values
            phase_vals = rand(length(levels),1); %generate random phase vals
            %now apply an inverse fft:
            wave = real(ifft(sqrt(levels).*(cos(2*pi*phase_vals)+1i*sin(2*pi*phase_vals))));
            wave = wave./max(abs(wave));
    

    在哪里? levels = the inversed a-weighting array .

    此示例创建一个灰色噪声振荡器,并在将信号返回到时域之前,对信号应用频域中的滤波器。

    正如你所提到的,你只需要公式,所以也许这条特定的线最有帮助(一旦你已经计算出逆a加权曲线):

    wave = real(ifft(sqrt(levels).*(cos(2*pi*phase_vals)+1i*sin(2*pi*phase_vals))));
    

    如代码开头所述,这是使用66 phon曲线,因此您可能需要调整 dB_vals 如果要使用不同级别的phon,请使用数组。

    我发现 this function 如有必要,可用于计算A加权的各种Phon曲线。

    推荐文章