1. 信号処理 - 3. ウィーナー フィルタリング (MATLAB コードを含む)

この記事は、ウィーナー フィルタリングをすばやく理解し、実際のデータを処理できるようにするのに適しています。


1. ウィーナーフィルタリングの原理

※詳しく解説している動画はたくさんあるので、ここでは詳しく説明しません。参考文献は以下の通りです。

音声強調 - ウィーナー フィルター 1_bilibili_bilibili

音声強調 - ウィーナーフィルター 2_bilibili_bilibili

2. ウィーナーフィルタ適用時の注意点

1. ウィーナー フィルタリングは、過去のすべての観測値現在の観測値に基づいて信号の現在の値を推定します。                                         

2. ウィーナー フィルターは定常的なランダム プロセスにのみ適しています

3. ウィーナー フィルターを設計するには、信号とノイズの間の相関関数を知る必要があります。

                                      

3. ウィーナーフィルターの実装

1. 1 次元信号を構築し、ノイズ信号を混合します。

(1) 元の 1 次元信号: Signal_Original = sin(2 * pi * 10 * t) + sin(2 * pi * 20 * t) + sin(2 * pi * 30 * t)

Fs = 1000; # 采样率
N = 1000; # 采样点数
n = 0:N - 1;
t = 0:1 / Fs:1 - 1 / Fs; # 时间序列
##期望信号
Signal_Original = sin(2 * pi * 10 * t) + sin(2 * pi * 20 * t) + sin(2 * pi * 30 * t);
plot(Signal_Original)
title('期望信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');

(2) ノイズ信号: Noise_White

##噪声信号
##前500点高斯分布白噪声,后500点均匀分布白噪声
Noise_White = [0.3 * randn(1, 500), rand(1, 500)];
plot(Noise_White)
title('噪声信号');
xlabel('Time(n)');
ylabel('Amplitude');

(3) 混合信号: Signal_Original + Noise_White

##噪声干扰后信号
Mix_Signal = Signal_Original + Noise_White; # 构造的混合信号
subplot(2,2,3)
plot(Mix_Signal)
title('噪声干扰后混合信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');

2. ウィーナーフィルターの設計:

*以下の全体的な構造フレームワークの重要なポイントと組み合わせると、ウィナー フィルタリングの原理を学ぶのにさらに役立ちます~

※主な手順は以下の通りです。

(1)混合信号の自己相関係数 Rxx  (ウィーナー フィルタリング原理で言及)

(2)混合信号と元の信号の間の相関係数 Rxy  (ウィーナー フィルタリング原理で言及)。 

xcorr 関数: 2 つのデータの相関係数を計算するために使用されます。

(3) 次数 M = 100 を設定します (調整可能なパラメーター、フィルター効果に影響します)。

(4) ループを介して混合信号自己相関行列 rxx(i,j) を構築します (ウィナー フィルタリングの原理で説明されています)。

(5) 混合信号と元の信号の間の相互相関ベクトル rxy(i) を取得します (ウィーナー フィルタリング原理で説明されています)。

(6) 設計されたウィーナーフィルター係数を取得します (キー データ、信号に対する後続のウィーナー フィルター操作に使用されます)。

h = inv(rxx)*rxy'

inv 関数: 逆行列を見つけるために使用されます。エラーが発生した場合は、pinv 関数を使用して擬似逆行列を見つけることができます。

##维纳滤波
Rxx = xcorr(Mix_Signal,Mix_Signal);# 得到混合信号的自相关函数
Rxy = xcorr(Mix_Signal,Signal_Original);# 得到混合信号和原始信号的互相关函数
M = 100;# 维纳滤波阶数
for i = 1:M # 得到混合信号的自相关矩阵
    for j = 1:M
        rxx(i,j) = Rxx(N-i+j);
    end
end
for i = 1:M # 得到混合信号和原信号的互相关向量
    rxy(i) = Rxy(i+N-1);
end
# 得到所要设计的Wiener滤波器系数
h = pinv(rxx)*rxy';

3. ノイズの多い信号のウィナー フィルタリング

フィルター関数: 設計されたフィルターに従って信号をフィルター処理するために使用されます。

##维纳滤波后的信号
Signal_Filter = filter(h,1,Mix_Signal);# 将输入信号通过维纳滤波器
plot(Signal_Filter);
title('维纳滤波后的信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');

subplot 関数を適用して 4 つの画像を同時に表示すると、最終的な効果は次のようになります。

4. 平均二乗誤差

*平均二乗誤差は、フィルター処理の前後の信号間の差を評価するためによく使用されます。

(フィルタリングの効果は画像表示で直接確認するより数値で評価した方が説得力があります)

※通常、実際の状況に応じて異なる評価指標が使用されます。

fprintf('引入噪声后信号相对原信号的统计均方误差:\n');
mse1 = mean((Mix_Signal-Signal_Original).^2); # 滤波后的信号相对原信号的统计均方误差
mse1
fprintf('滤波后的信号相对原信号的统计均方误差:\n');
mse2 = mean((Signal_Filter-Signal_Original).^2); # 滤波后的信号相对原信号的统计均方误差
mse2

means関数: 平均値の計算。

* 元の信号に対するノイズ導入後の信号の統計的平均二乗誤差:

mse1 = 0.2172

* 元の信号に対するフィルター処理された信号の統計的平均二乗誤差:

mse2 = 0.0306

ウィナー フィルターを適用すると、信号は元の信号に近づきます。


おすすめ

転載: blog.csdn.net/qq_41958946/article/details/127578623