SG滤波matlab源码
时间: 2023-11-02 09:20:09 浏览: 139
您好!以下是一个简单的SG(Savitzky-Golay)滤波器的 MATLAB 源代码示例:
```matlab
function filteredData = sgFilter(data, windowSize, polynomialOrder)
if nargin < 3
polynomialOrder = 2; % 默认多项式阶数为2
end
if nargin < 2
windowSize = 5; % 默认窗口大小为5
end
% 检查窗口大小是否为奇数,若为偶数则加1
if mod(windowSize, 2) == 0
windowSize = windowSize + 1;
end
halfSize = floor(windowSize / 2);
dataSize = length(data);
% 创建 SG 系数矩阵
X = zeros(windowSize, polynomialOrder + 1);
for i = 1:windowSize
for j = 1:polynomialOrder + 1
X(i, j) = (i - halfSize - 1)^(j - 1);
end
end
% 计算伪逆矩阵
X_pseudoInv = pinv(X);
% 对原始数据进行滤波
filteredData = zeros(size(data));
for i = 1:dataSize
if i <= halfSize
% 首部数据不足时,直接拟合取平均值
filteredData(i) = mean(data(1:(i+halfSize)));
elseif i > dataSize - halfSize
% 尾部数据不足时,直接拟合取平均值
filteredData(i) = mean(data((i-halfSize):dataSize));
else
% 对每个窗口进行拟合并取平均值
filteredData(i) = mean(X_pseudoInv * data((i-halfSize):(i+halfSize)));
end
end
end
```
使用示例:
```matlab
% 生成测试数据
data = sin(0:0.1:10) + randn(1, 101) * 0.1;
% 调用 SG 滤波函数
filteredData = sgFilter(data, 5, 2);
% 绘制原始数据和滤波后的数据
figure;
plot(data, 'b-', 'LineWidth', 1.5);
hold on;
plot(filteredData, 'r-', 'LineWidth', 1.5);
legend('原始数据', '滤波后数据');
```
这是一个简单的SG滤波器实现,您可以根据需要自行调整窗口大小和多项式阶数。希望对您有所帮助!
阅读全文