我正在尝试破译隐藏在非常嘈杂(听起来像带有额外低无人机的白噪声)音频文件(.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;
非常感谢任何和所有的帮助。谢谢!
答案 0 :(得分:0)
如果您没有关于噪音的先前信息,那么过滤通常不是一个好主意。如果您知道噪声能量集中在某个频率以上,那么您的概念就可以正常工作。低通滤波可以为您提供可观的SNR效益,但代价是丢失更高频率的语音信息。但同样,只有在您了解噪声的平均频谱曲线时,这才有用。
您需要利用任何有关噪声与语音信号不同的信息。谱减法技术可能会给你带来更多好处。如果您的样本中的语音之前有一些噪音,您可以根据该信息制作补偿滤波器。
在时间频率响应方面噪音是什么样的?如果它是相对静止的,你可以使用语音经过高度调制(约4Hz)来估计不同频段的SNR,然后用最差的SNR估计衰减频段。
录音中有多少声道?如果它大于1,并且目标音频的空间位置不会改变,则可以使用互相关技术来提高SNR。
答案 1 :(得分:0)
如果是说出数字的人声,那么您可以安全地过滤掉500 Hz及以上的所有频率,例如8 kHz。从那里,你可以更安全地计算出哪些频率掩盖了声音。
如果你想作弊,你可以给一个带有窄带贝尔滤波器的参数均衡器拍摄的音频样本,扫过500 - 8000赫兹的范围直到你得到的东西:)虽然问题听起来更像在Matlab课程中做作业。
我的Matlab对于代码来说太生疏了,但这里有一些尝试: