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

Making grey audio noise using matlab / octave

我可以通过选择不同的 invfnorm 变量来使用下面的代码片段创建粉红色、棕色、蓝色的音频噪声,但如何创建灰色噪声?

%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

在 link https://en.wikipedia.org/wiki/Colors_of_noise 中,他们给出了粉红色、棕色、蓝色音频噪声的公式,但对于灰色噪声,他们只是说它是 "an inverted A-weighting curve" 没有显示公式,我只需要公式。 请参阅下面的频谱。

我获取这些信息的网站位于此处 grey noise

Ps: 我正在使用类似于 matlab

的 Octave 4.2.2

如您所述,灰度噪声是通过应用逆 a 加权曲线产生的。

以下代码片段是 Matlab example (thanks to 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 方曲线,因此如果您想使用不同级别的方,您可能需要调整 dB_vals 数组。

我发现 this function 对于计算 a 加权的各种方曲线非常有用,如有必要。