如您所述,灰色噪声是通过应用逆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曲线。