Matlab生成白噪和粉噪

音频测试中常用音源包括:白噪、粉噪(粉噪由于模拟人耳,常用来测量扬声器响度)

生成音源文件的方式:CoolEdit、Matlab

function WhiteNoise = generateWhiteNoise(Fs,t,Amp)
%% 通过randn函数生成高斯白噪声
N = t*Fs;                                               %采样点数
WhiteNoise = randn(1,N)';
WhiteNoise = WhiteNoise * 10^(Amp/20);                  %产生白噪    
%% 计算功率谱和功率密度谱
% X = fft(WhiteNoise(1:N));
% noise_pw = (abs(fft((WhiteNoise(1:N))'))).^2/N;      %功率谱
% noise_psd = (abs(fft((WhiteNoise(1:N))'))).^2/N/Fs;    %功率谱密度
% f = (Fs/length(X))*[0:(length(X)-1)];
% ind = find(f<Fs/2);
% f = f(ind); 
% X = X(ind);
% noise_pw = noise_pw(ind);
% noise_psd = noise_psd(ind);
% f = f';
% subplot(131);
% plot(t/N:t/N:t,WhiteNoise,'r');
% xlabel('Time [s]');
% subplot(132);
% plot(f,noise_pw,'r');
% grid on;
% xlabel('Frequency [Hz]');
% ylabel('功率谱');
% subplot(133);
% plot(f,noise_psd,'r');
% grid on;
% xlabel('Frequency [Hz]');
% ylabel('功率谱密度 [W/Hz]');
% sound(WhiteNoise);
end
function pinknoise = generatePinkNoise(Fs,t,Amp)
%% 生成白噪
WhiteNoise = randn(Fs*t+1,1);
%% 通过滤波实现粉噪每倍频能量一致
b=zeros(7,1);
PinkNoise = zeros(((Fs*t)+1),1);
for i=1:((Fs*t)+1)
    b(1) = 0.99886 * b(1) + WhiteNoise(i) * 0.0555179;
    b(2) = 0.99332 * b(2) + WhiteNoise(i) * 0.0750759;
    b(3) = 0.96900 * b(3) + WhiteNoise(i) * 0.1538520;
    b(4) = 0.86650 * b(4) + WhiteNoise(i) * 0.3104856;
    b(5) = 0.55000 * b(5) + WhiteNoise(i) * 0.5329522;
    b(6) = -0.7616 * b(6) - WhiteNoise(i) * 0.0168980;
    PinkNoise(i) = b(1) + b(2) + b(3) + b(4) + b(5) + b(6) + b(7) + WhiteNoise(i) * 0.5362;
    b(7) = WhiteNoise(i) * 0.115926; 
end
%% 归一化
if(abs(min(PinkNoise)) > max(PinkNoise))  
    PinkNoise = PinkNoise / abs(min(PinkNoise));
else
    PinkNoise = PinkNoise / max(PinkNoise);
end 
PinkNoise = PinkNoise /abs(((2^31)-1)/(2^31));          %避免出现饱和
PinkNoise = PinkNoise * 10^(Amp/20);                    %恢复到需要的幅度
pinknoise = PinkNoise(1:end-1);
plot(1/Fs:1/Fs:t,pinknoise);
xlabel('Time [s]');
sound(pinknoise);
end

参考文章:粉红噪声matlab产生_谢娘蓝桥的博客-CSDN博客_matlab生成粉红噪声

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值