function [p,f] = pSpecAnalysis(data,fs,options)
% 对数据进行及频谱分析(画频谱或功率谱)
% 输入:
% data为待分析信号,需要是一维实数
% fs为采样频率,即每秒钟采样点数
% options为可选选项,使用结构体的方式导入,安装自身需求选择是否设置。具体包括:
% options.Detrend :去趋势,设置options.Detrend = 1时,将在做fft前去除data趋势,
% 当画出的频谱图在0频率时出现峰值,可将该选项置1,可以有效抑制0频率的峰值,默认情况不去趋势
% options.analysisType :频谱分析类型,当options.analysisType = 'fft'时,进行快速傅里叶变化FFT
% 当options.analysisType = 'psd'时,计算功率谱
% options.psdUnit :功率谱单位,当options.psdUnit = 1时,单位为W/Hz(默认)
% 当options.psdUnit = 2时,单位为分贝dB
% options.plotType :画图种类选择,当options.plotType = 1时,只绘制信号频谱图(默认)
% 当options.plotType = 2时,绘制信号时域图和频谱图在同一张图上(上下两张)
% Copyright (c) 2021 Mr.看海 All rights reserved.
% 原文链接 https://zhuanlan.zhihu.com/p/447781065
% 代码地址:http://www.khscience.cn/docs/index.php/2021/12/21/freana/
% 本代码为淘宝买家专用,不开源,请勿公开分享~
%%
[p,f] = kSpecAnalysis(data,fs,options);
if ~isfield(options,'analysisType')
options.analysisType = 'fft';
end
if strcmp(options.analysisType,'fft')
ti = '频谱图';
elseif strcmp(options.analysisType,'psd')
ti = '功率谱图';
end
if ~isfield(options,'plotType')
options.plotType = 1;
end
if ~exist('options.plotType')
if options.plotType == 1
figure('color','w')
plot(f,p,'k');xlim([f(1),f(end)]);
xlabel('频率(Hz)')
ylabel('幅值')
title(ti)
elseif options.plotType == 2
figure('color','w')
subplot(2,1,1)
t = 1/fs:1/fs:length(data)/fs;
plot(t,data,'k');xlim([t(1),t(end)]);
xlabel('时间(s)')
ylabel('幅值')
title('时域信号')
subplot(2,1,2)
plot(f,p,'k');xlim([f(1),f(end)]);
xlabel('频率(Hz)')
ylabel('幅值')
title(ti)
end
end
end