0

我正在尝试破译隐藏在非常嘈杂(听起来像带有额外低无人机的白噪声)音频文件(.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;

结尾

任何和所有的帮助将不胜感激。谢谢!

我的过滤信号和原始信号的图

4

2 回答 2

0

如果是人声说出数字,那么您可以安全地完全过滤掉所有低于 500 Hz 及以上的频率,例如 8 kHz。从那里,您可以更安全地确定哪些频率掩盖了声音。

如果你想作弊,你可以用一个带有窄带钟形滤波器的参数均衡器给音频样本一个镜头,然后扫描 500 - 8000 Hz 范围,直到你得到一些东西:) 虽然这个问题听起来更像是一个家庭作业Matlab课程。

我的 Matlab 对于代码来说太生疏了,但这里有一些东西可以尝试:

  1. 添加一个 500 Hz 的高通滤波器
  2. 添加一个 8 kHz 的低通滤波器
  3. 在人耳最敏感的地方添加一个窄钟形滤波器,比如 4 kHz。将其提高 6 dB 以清除其他频率的掩蔽效应。
  4. 为了增加效果,也可以提升较低和较高的谐波(2 kHz 和 8 kHz),但降低 dB
于 2012-12-04T12:51:24.417 回答
0

如果您没有关于噪声的先验信息,那么过滤通常不是一个好主意。如果您知道您的噪声能量集中在某个频率以上,您的概念就可以正常工作。低通滤波可能会给您带来可观的 SNR 优势,但代价是会丢失较高频率的语音信息。但同样,这只有在您知道噪声的平均频谱分布时才有用。

您需要利用任何信息,了解是什么使噪声与语音信号不同。光谱减法技术可能会给您带来更多好处。如果样本中的语音之前有一些噪音,则可以根据该信息制作补偿滤波器。

就时频响应而言,噪声是什么样的?如果它相对静止,您可以利用语音被高度调制(大约 4Hz)的事实来估计不同频段的 SNR,然后衰减具有最差 SNR 估计的频段。

录音中有多少个音频通道?如果它大于 1,并且您的目标音频源的空间位置没有改变,您可以使用互相关技术来提高 SNR。

于 2012-12-04T08:28:43.030 回答