从嘈杂的语音信号中过滤消息

信息处理 matlab 噪音 低通滤波器 语音
2022-01-04 17:44:00

我正在尝试破译隐藏在非常嘈杂的音频文件(.wav)中的消息(我认为这是带有额外低无人机的白噪声)。该消息是一个六位数字我没有关于噪音的更多细节。

我尝试使用低通滤波器,希望消除大部分较高的频率可以让我听到数字,但是,我似乎也无法摆脱足够低的无人机来足够好地听到声音。我的尝试如下(最后freq_space_low_pass_filter包含了使用的功能):

[data, SampleRate, NbitsPerSample]=wavread('noisy_msg6.wav');

y=data(:,1); % we will work only with one channel in this demo 
N=length(y); %number of sample points
t=( (1:N)*1/SampleRate ).'; % time spacing is 1/SampleRate and we want column vector

Y=fft(y);

spectrum_freq=fourier_frequencies(SampleRate, N);

Freq3db=100;
[spectrum_filtered,g_vs_freq]=freq_space_low_pass_filter(Y, SampleRate, Freq3db);


y_filtered=ifft(spectrum_filtered);

y_filtered=real(y_filtered);



wavwrite(y_filtered/(0.1+max(y_filtered)), SampleRate, NbitsPerSample,
         'noisy_msg6_filtered.wav');

%%%%%%%%down sampling%%%%%%%%

indexes=(abs(spectrum_freq) < 10*Freq3db);
spectrum_freq_down_sampled = spectrum_freq(indexes);
spectrum_down_sampled = spectrum_filtered(indexes);
N_down_sampled = length(spectrum_down_sampled);

spectrum_down_sampled=spectrum_down_sampled*N_down_sampled/N;

SampleRate_down_sampled=SampleRate*N_down_sampled/N;

y_down_sampled=real(ifft(spectrum_down_sampled));
t_down_sampled = ( (1:N_down_sampled)*1/SampleRate_down_sampled ).';

sound(y_down_sampled, SampleRate_down_sampled)

function [spectrum_filtered,g]=freq_space_low_pass_filter(spectrum, SampleRate, Freq3db)
%% applies low pass filter in the frequency domain
% spectrum - result of fft on time series data (column vector is expected)
% SampleRate - measured in Hz, 1/dt where dt spacing of the points in time domain
% Freq3db - desired 3db roll off point in Hz

N=length(spectrum);

function G=filter_gain(freq, Freq3db)
    G=1./(1+1i*freq/Freq3db); % this corresponds to low pass RC filter
end

spectrum_freq=fourier_frequencies(SampleRate, N);

% calculate filter gain for each spectrum frequency
g=filter_gain(spectrum_freq, Freq3db);
spectrum_filtered=spectrum.*g;
end

信号频谱图: 图片

3个回答

几点:

  1. 频域中的滤波很复杂,需要像重叠相加这样的真实算法来避免时域混叠。直接在时域中过滤要容易得多: [b,a] = butter(1,100/(SampleRate/2); y_filtered = filter(b,a,y); 要好得多
  2. 您可能想在无人机频率上放置陷波滤波器
  3. 对于宽带固定噪声,一个好的方法是维纳滤波或谱减法。许多论文已经发表在这方面。

您提到使用低通滤波器,但正如其中一位评论者提到的那样,您可能会更好地使用带通滤波器来滤除低频噪声。如果您对预先存在的解决方案感兴趣,第三方库中也存在降噪过滤器。

人声有一些特性可能会有所帮助。一方面,女性声音从大约 200Hz 开始,男性声音较低,所以在这里做一个高通滤波器会有所帮助。另请参阅声学特征区分男性和女性声音

此外,通过直方图识别无人机频率。

在代码中完成所有这些工作有点麻烦。您是否考虑过像Audacity这样的音频程序?