matlab不同频率声音的声强如何归一

请问不同频率的声音用声级计测出来声强不同。能否用matlab从声音生成的时候设置其声强大小呢?最终是需要声级计对不同频率声音测出来的声强相同。求指导,感谢!

法思路总结 谱减法是一种基于频域的语音增强方法,通过对带噪语音信号的短时傅里叶变换得到语音信号的功率谱和噪声功率谱,然后相减得到语音信号的纯净功率谱,再用带噪语音信号的相位近似纯净语音信号的相位,最后进行反傅里叶变换得到增强后的语音信号。

由于谱减法适用的信噪比范围较窄,在信噪比较低时对语音的可懂度损伤较大,所以在实际应用时需要降低噪声的同时还要兼顾语音的可懂度和自然度。

回答: 可以利用谱减法将不同频率的声音声强归一化。以下是一个Matlab实现代码的示例:

% 读取音频文件
[s1,fs1] = audioread('sound1.wav');
[s2,fs2] = audioread('sound2.wav');

% 对原始信号进行短时傅里叶变换,得到语音信号的功率谱和噪声功率谱
window_length = 1024; % 窗口长度
hop_size = 512; % 帧移
[~,F,T,Pxx_1] = spectrogram(s1,hamming(window_length),window_length-hop_size,window_length,fs1);
[~,~,~,Pxx_2] = spectrogram(s2,hamming(window_length),window_length-hop_size,window_length,fs2);

% 计算带噪语音的信噪比
SNR = zeros(size(Pxx_1));
for i = 1:size(Pxx_1,2)
    noise_Pxx = median(Pxx_1(:,max(1,i-10):min(size(Pxx_1,2),i+10)),2); % 计算噪声功率谱,使用邻近帧的平均值
    signal_Pxx = Pxx_1(:,i) - noise_Pxx; % 计算信号功率谱
    SNR(:,i) = signal_Pxx./noise_Pxx; % 计算信噪比
end

% 利用信噪比计算噪声功率谱的加权平均值
SNR_mean = mean(SNR(SNR>0)); % 去除负值
noise_Pxx_1 = median(Pxx_1(:,SNR<SNR_mean*0.9),2); % 信噪比小于平均值90%的帧作为噪声帧
noise_Pxx_2 = median(Pxx_2(:,SNR<SNR_mean*0.9),2);

% 计算纯净语音功率谱
Pxx_clean_1 = max(0, Pxx_1 - noise_Pxx_1); % 将小于0的幅度值置为0 
Pxx_clean_2 = max(0, Pxx_2 - noise_Pxx_2); 

% 合成增强后的语音信号
s1_enhanced = istft(sqrt(Pxx_clean_1).*exp(1j*angle(stft(s1,window_length,hop_size,window_length,fs1))),window_length,hop_size,window_length,fs1);
s2_enhanced = istft(sqrt(Pxx_clean_2).*exp(1j*angle(stft(s2,window_length,hop_size,window_length,fs2))),window_length,hop_size,window_length,fs2);

% 可视化增强前后的语音信号
time = (0:length(s1)-1)/fs1;
figure;
subplot(2,2,1), plot(time,s1), title('Original sound 1');
subplot(2,2,2), plot(time,s2), title('Original sound 2');
subplot(2,2,3), plot(time,s1_enhanced), title('Enhanced sound 1');
subplot(2,2,4), plot(time,s2_enhanced), title('Enhanced sound 2');

这段代码中,先读取两个音频文件,然后利用短时傅里叶变换计算语音信号的功率谱和噪声功率谱,进而计算信噪比。根据信噪比计算噪声功率谱的加权平均值,并用它来计算纯净语音的功率谱。最后利用反傅里叶变换得到增强后的语音信号。

值得注意的是,在实际应用中,需要根据具体情况选择合适的窗口长度、帧移、信噪比阈值等参数,以达到更好的增强效果。