1

通过选择要在下面使用的不同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

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

灰噪声 我获得这些信息的网站位于此处灰色噪音

Ps:我使用的是类似于matlab的Octave 4.2.2

4

1 回答 1

1

正如您所提到的,灰色噪声是通过应用反向 a 加权曲线创建的。

以下片段是一个Matlab 示例(感谢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,您可能需要调整阵列。

如果需要,我发现这个函数对于计算 a 加权的各种 phon 曲线非常有用。

于 2018-06-07T10:19:51.160 回答