1

私はMatlabでいくつかの測定データを滑らかにしようとしていますが、そう思います.何かが欠けています. ガウス ウィンドウを作成する独自のコードを作成しました。ただし、残りのコードはこのリンクからコピーされます。

% Generate sample data.
vector = 5*(1+cosd(1:3:180)) + 2 * rand(1, 60);
hist (vector)  ;
plot(vector, 'r-', 'linewidth', 3);
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.

% Construct blurring window.
windowWidth = int16(11);
halfWidth = windowWidth / 2 ;
gaussFilter = Gaussain (-5:5, 0, 1 ) ;
gaussFilter = gaussFilter / sum(gaussFilter); % Normalize.

% Do the blur.
smoothedVector = conv(vector(halfWidth:end-halfWidth), gaussFilter) ;

% plot it.
hold on;
plot(smoothedVector, 'b-', 'linewidth', 3);

私の間違いを正すのを手伝ってください。以下は、ガウス ウィンドウを生成するためのコードです。

function y = Gaussain ( window, mu, sigma) 
% y = exp (-((window - mu).^2)/(2*sigma^2)).* (1/(sigma * sqrt(2* pi)))  ;
y = exp (-((window - mu).^2)/(2*sigma^2)) ;
end

Matlab ツールキットの方法を使用しないソリューションを探しています。いくつか修正した後、次の出力が得られます。ここに画像の説明を入力

4

2 に答える 2

4

フィルターに一致するWindowWidthように見えます。int16(11)または、タップ数が 11 ではなく 50 のフィルターを使用することもできますWindowWidth = int16(50)。現在の値では、出力信号のトリミングが多すぎます。

次の図を参照してくださいWindowWidth = int16(11): http://i.stack.imgur.com/WOnW9.png

ここに画像の説明を入力

于 2013-07-31T10:35:57.843 に答える
2

私は同じトピックを調査し、この投稿を作成して問題を解決し、いくつかの調整と一般化を行いました。以前の返信の作成者に感謝します。ここに私の一般化されたコードを示します。これは、n 次元の点ベクトルでも機能します。

% SMOOTH Simple gaussian smooth function
% vector = input vector
% width = width of the smoothing
% window = width of the window to be used in the convolution
% 
% Credits: Generalization of a post made by User1551892 and Louis Mendo on 
% StackOverflow
% Created by: Leonardo Daga, 2016
function smoothedVector = smooth(vector, width, window)

% Check arguments and fill with defaults
if nargin < 2,
    width = 2;
end

if nargin < 3,
    window = width * 5 + 1;
end

% Rotate vector to a column vector (if needed) to make the code easier
if size(vector,1) > size(vector,2)
    isColumn = true;
else
    isColumn = false;
    vector = vector';
end

% Construct blurring window.
windowWidthInt = int16(window);
halfWidth = double(windowWidthInt / 2);
gaussFilter = Gaussian(-(halfWidth-1):(halfWidth-1), 0, width/2 ) ;
gaussFilter = gaussFilter / sum(gaussFilter);

% Do the blur, enlarging the vector to blur from the start with a
% convenient value and cutting the vector back when the blurring is done
enlargedVector = [ones(window, 1)*vector(1,:);
    vector;
    ones(window, 1)*vector(end,:)];

smoothedVector = zeros(size(enlargedVector,1)-1,size(enlargedVector,2));

for i=1:size(vector,2),
    smoothedVector(:,i) = conv(enlargedVector(halfWidth:end-halfWidth,i), gaussFilter) ;
end

smoothedVector = smoothedVector(window:end-window,:);

% Rotate back the vector, if it was a row vector
if (isColumn == false)
    smoothedVector = smoothedVector';
end

end

%% Create a gaussian vector to be used for the convolution
function y = Gaussian ( window, mu, sigma)
y = exp (-((window - mu).^2)/(2*sigma^2)) ;
end

この関数は、次のサンプル コードで実行できます。

% Generate sample data.
vector = [5*(1+cosd(1:3:900)) + 2 * rand(1, 300);
    5*(1+sind(1:3:900)) + 2 * rand(1, 300)];

smoothedVector = smooth(vector, 5) ;

% plot it.
figure
plot(1:size(vector,2), vector, 'r-', 1:size(smoothedVector,2), smoothedVector, 'b-');
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.

次の図を取得します。

ガウスぼかしで平滑化されたコサインとサイン

于 2016-11-12T10:19:11.287 に答える