在频域的每个点,背景噪声的幅值一定是小于含噪信号的幅值的么?
在实验室测试了一组声音信号和安静环境的信号,做完傅里叶变换之后,含噪信号的幅值还有小于背景噪声幅值的地方,是合理的么?我导儿说不对,我认为是可能存在的,因为信号叠加之后也有可能起到减弱作用。(蓝的是信号,黄的是背景噪声)
还有信号分离,想从含噪信号中分离出纯信号,是不是做完FFT之后,含噪信号的复数减去背景噪声的复数就行了?
希望顺便给出参考文献or书籍之类的来说服导儿,谢谢。
可以用于绘制背景噪声与含噪信号的频域幅值:
生随机噪声信号,再将其叠加到原始语音信号中,进而得到含噪语音信号。通过FFT分析信号频谱,观察到含噪语音信号频谱上出现了噪声信号的频率成分。因此,可以设计带通滤波器,对含噪信号进行降噪过滤,去除噪声信号的影响,提取纯语音信号。
代码示例:
% 读取语音信号并绘制时域波形 [in_sound, Fs] = audioread('speech.wav'); t = 0:1/Fs:(length(in_sound)-1)/Fs; figure; plot(t, in_sound); xlabel('Time (s)'); ylabel('Amplitude'); title('Original Speech Signal');
% 对语音信号加入高频和低频信号模拟噪声 noise_low = 0.2sin(2pi200t)'; noise_high = 0.1sin(2pi4000t)'; noisy_sound = in_sound + noise_low + noise_high; figure; plot(t, noisy_sound); xlabel('Time (s)'); ylabel('Amplitude'); title('Noisy Speech Signal');
% 对含噪信号进行FFT分析,观察到噪声频率成分 f = Fs(0:(length(noisy_sound)/2))/length(noisy_sound); Y = fft(noisy_sound); P2 = abs(Y/length(noisy_sound)); P1 = P2(1:length(noisy_sound)/2+1); P1(2:end-1) = 2P1(2:end-1); figure; plot(f, P1); xlabel('Frequency (Hz)'); ylabel('Magnitude'); title('FFT of Noisy Speech Signal');
% 设计带通滤波器,进行降噪过滤 Fc_low = 100; % 低截止频率 Fc_high = 4000; % 高截止频率 numtaps = 100; % 滤波器阶数 b = fir1(numtaps, [Fc_low, Fc_high]/(Fs/2), 'bandpass'); filtered_sound = filter(b, 1, noisy_sound); figure; plot(t, filtered_sound); xlabel('Time (s)'); ylabel('Amplitude'); title('Filtered Speech Signal');