ノイズの多い音声信号からメッセージをフィルタリングする


9

非常にノイズの多いオーディオファイル(.wav)に隠されたメッセージを解読しようとしています(低ドローンが追加されたホワイトノイズだと思います)。メッセージは6桁の数字です。騒音についてこれ以上詳しく知りません。

私はローパスフィルターを使用して、高周波数のほとんどを排除すると数字が聞こえるようになることを期待しましたが、低ドローンを十分に取り除くことができず、声を十分に聞くことができません。私の試みは次のとおりでした(採用された機能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

信号スペクトルのプロット: 画像


使用しているサンプルを提供していただけますか?そして多分あなたの結果?
ペネロペ

プロット画像をアップロードできず(ポイントが不十分)、ファイルにリンクする方法がありません
user1825494

1
コメントにリンクを入れると、誰かが喜んでそれらを編集します。そして、どこかにファイルをアップロードしてリンクを提供する方法を見つけた場合も、それを元に戻します。
ペネロペ2012

2
対数-対数でプロットされている場合、グラフははるかに有益です。そのままでは、約1.5 kHz〜22.5 kHzの広帯域ノイズがあり、約2 kHzの狭帯域トーンがあるようです。私が想定しているのは、「音声」信号と、かなりのDCオフセットのように見えるものが、かなり静かな「穴」にあることです。適切なバンドパスフィルターで分離するのはそれほど難しくありません。
Dave Tweed

回答:


1

いくつかのポイント:

  1. 周波数領域でのフィルタリングは複雑であり、時間領域のエイリアシングを回避するには、オーバーラップ加算などの実際のアルゴリズムが必要です。時間領域で直接フィルタリングする方がはるかに簡単です:[b、a] = butter(1,100 /(SampleRate / 2); y_filtered = filter(b、a、y);ははるかに優れています
  2. ドローンの周波数にノッチフィルターを適用したい場合があります
  3. 広帯域定常ノイズの場合、適切な方法は、ウィーナーフィルタリングまたはスペクトル減算です。これに関して多くの論文が発表されています。

0

ローパスフィルターの使用について言及しましたが、コメンターの1人が述べたように、おそらくバンドパスフィルターを使用して低周波ノイズもフィルターで除去する方が良いでしょう。既存のソリューションに興味がある場合は、サードパーティのライブラリにノイズ低減フィルターも存在します。


0

人間の声には、役立つかもしれないいくつかの特徴があります。まず、女性の声は約200Hzで始まり、男性の声は低いためここでハイパスフィルターをかけると少し役立ちます。また、acoustic-features-distinguishing-the-male-and-female-voiceも参照してください。

さらに、ヒストグラムを介してドローンの頻度を特定します。

これらすべてをコードで行うのは少し面倒です。Audacityのようなオーディオプログラムを検討しましたか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.