【问题标题】:Creating a Gaussian Filter Transformation Matrix for 1D Signals为一维信号创建高斯滤波器变换矩阵
【发布时间】:2018-02-15 17:56:35
【问题描述】:

我有一个大小为120x1 的信号。我正在尝试创建一个一维高斯滤波器(G),这样当它乘以信号时,它会生成滤波后的信号。

sFilt = G*s

我知道 MATLAB filter 函数可以通过以下方式应用此转换:

i = -30:30;
sigma = 2;
gaussFilter = exp(- i.^ 2 / (2 * sigma ^ 2));
gaussFilter = gaussFilter / sum (gaussFilter); % normalize
s = rand(120,1); % Example signal
sFilt = filter(gaussFilter,1, s); % Example filtered signal

但是,我想自己找到内核矩阵,而不是 MATLAB 在内部找到并将其应用于我的信号。

这是我要查找的信号G

s = [...
       0.00694444000000000  0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.930556000000000   3.38767207896461    2.96157398017693    -0.333333000000000  1.60762896805897    2.00694000000000    2.00694000000000    2.00694000000000    1.28472000000000    -1.43744631449631   0.944444000000000   2.59392295081968    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.02922488524590    -0.812570065573777  -1.18993444717445   -0.782122839475842  0.640152000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   2.01873464373465    4.49027190008191    5.18750000000000    5.18750000000000    5.18750000000000    5.18750000000000    5.18750000000000    4.59722000000000    2.59722000000000    3.97561321867322    3.21314756756758    0.604167000000000   0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.111111000000000   0.458646085995084   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000
    ]';

这是添加了噪声的滤波信号。

sFilt = [...
       0.0138889000000000   0.00208355909090909 -0.00329849545454587    0.201389000000000   0.861111500000000   1.86806000000000    2.44947936559843    2.52500275098103    2.15972000000000    2.04861000000000    2.14807844644317    2.16668303352412    1.78457304987735    1.27778000000000    1.00173350000000    1.57634828431373    2.33333000000000    3.21248677841374    3.55556000000000    3.64930500000000    3.71804717320261    3.81944000000000    3.49947244281046    2.76389000000000    1.65451500000000    0.470087078495503   -0.229167000000000  -0.208333000000000  0.354167000000000   0.789952043336059   1.08820161079313    1.19444000000000    1.19444000000000    1.07082559280458    1.09288587898610    1.19444000000000    1.20139000000000    1.23611000000000    1.45729755519215    2.02778000000000    3.14999395748160    4.65278000000000    5.78193152902698    6.30624161896975    6.45139000000000    6.34444931316435    5.92361000000000    5.44723022076860    4.78127380212592    4.18750000000000    3.06944000000000    1.72222000000000    0.791893542109568   0.312170886345054   0.0555556000000000  0.00694444000000000 0.0482593386437905  0.0524382556009807  -0.0647580647058824 -0.0694444000000000 0.0486111000000000  0.0249897492232223  0.0356016021241839  0.256944000000000   0.361111000000000   0.573964112019624   0.681776461161079   0.674996493049878   0.583855436631235   0.625000000000000   0.701389000000000   0.701389000000000   0.673611000000000   0.729167000000000   0.701389000000000   0.659722000000000   0.583333000000000   0.645833000000000   0.687500000000000   0.701389000000000   0.625000000000000   0.625000000000000   0.701389000000000   0.701389000000000   0.629343798855273   0.583333000000000   0.625000000000000   0.645833000000000   0.631944000000000   0.460070669664759   0.665622201962387   0.527778000000000   0.562500000000000   0.520833000000000   0.562500000000000   0.541667000000000   0.645833000000000   0.708333000000000   0.581075065359477   0.579855317512275   0.548611000000000   0.666667000000000   0.548611000000000   0.618056000000000   0.576389000000000   0.590278000000000   0.645833000000000   0.666667000000000   0.554531401639344   0.548611000000000   0.576389000000000   0.583333000000000   0.656560276422764   0.584357622950820   0.559938565573770   0.465278000000000   0.583333000000000   0.659722000000000   0.687500000000000   0.673611000000000
      ]';

我尝试了以下代码来获取G,但它没有生成正确的滤波信号:

G = zeros(180); % Zero padding G
i = -30:30; 
sigma = 2;
gaussFilter = exp(- i.^ 2 / (2 * sigma ^ 2));
gaussFilter = gaussFilter / sum (gaussFilter); % normalize
for i = 31 : 150
    G(i, i-30:i+30) = gaussFilter;
end
G = G(31:150,31:150); % Truncate to size 120x120

可以看出,G*ssFilt 不同,无论噪音如何。我的目标是能够找到G,使得G*s = sFilt不管噪声和滤波后的信号具有大致相同的幅度。

请问我创建G 的方式是否正确?如果没有,我应该如何为信号s 构建G?给定ssFilt,找G = sFilt * pinv(s)是否正确,我怕得到一个奇异矩阵?

【问题讨论】:

  • 我得到了完全相同的结果。你确定你对两者都使用了相同的输入s 吗?也许一个minimal reproducible example 可以澄清你的问题(包括绘图代码)。
  • s 用于G*ssFilt 进行比较。当我申请G*s 时,我没有得到正确的幅度。
  • 我无法重现您的图表。我在他们俩之间变得完全一样。顺便说一句,我必须将 s = rand(500,1); 更改为 s = rand(120,1); 才能使乘法起作用。
  • 我只想知道如何创建G。这些代码只是澄清我的问题的示例。

标签: matlab filter gaussian


【解决方案1】:

我认为您应该打错字了,因为两种方法的结果完全相同:

s = [...
       0.00694444000000000  0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.930556000000000   3.38767207896461    2.96157398017693    -0.333333000000000  1.60762896805897    2.00694000000000    2.00694000000000    2.00694000000000    1.28472000000000    -1.43744631449631   0.944444000000000   2.59392295081968    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.99306000000000    2.02922488524590    -0.812570065573777  -1.18993444717445   -0.782122839475842  0.640152000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   0.909722000000000   2.01873464373465    4.49027190008191    5.18750000000000    5.18750000000000    5.18750000000000    5.18750000000000    5.18750000000000    4.59722000000000    2.59722000000000    3.97561321867322    3.21314756756758    0.604167000000000   0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.00694444000000000 0.111111000000000   0.458646085995084   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000   0.506944000000000
    ];

i = -30:30;
sigma = 2;
gaussFilter = exp(- i.^ 2 / (2 * sigma ^ 2));
gaussFilter = gaussFilter / sum (gaussFilter); % normalize
sFilt = filter(gaussFilter,1, s); % Example filtered signal

G = zeros(180); % Zero padding G
for i = 31 : 150
    G(i, i-30:i+30) = gaussFilter;
end
G = G(31:150,31:150); % Truncate to size 120x120

figure
hold on
plot(s)
plot(sFilt(31:end))
plot(G*s')

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多