我可以通过选择下面使用的其他 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加权曲线”没有显示配方,我只需要配方。
见下面的频谱。
我获得这些信息的网站位于grey noise
Ps:我使用的是Octave 4.2.2,类似于matlab
答案 0 :(得分:1)
正如您所提到的,灰色噪声是通过应用反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曲线,因此如果您想使用不同级别的phon,则可能需要调整dB_vals
数组。
如果有必要,我发现this function对于计算加权的各种phon曲线非常有用。