使用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 加权的各种方曲线非常有用,如有必要。
我可以通过选择不同的 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" 没有显示公式,我只需要公式。
请参阅下面的频谱。
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 加权的各种方曲线非常有用,如有必要。