matlab信号求相位简单例子

clc;
close all;
t = 0:0.01:100;
tt = 2*pi*t;
len = length(tt);
y = 41*sin(tt+30/180*pi)+2*sin(22*tt+0.2)+5*cos(10*tt)+4*(rand(1,len)-0.5);
z = zeros(1,100);
z(1) = 1;
y2 =[repmat(z,1,100),0];
figure();
plot(t,y,'b',t,90*y2-45,'r');
rb_data = [t',y',y2'];

rbdata = rb_data(1:end-35,:);
smpltime = rbdata(:,1);
vib = rbdata(:,2);
rev = rbdata(:,3);
figure()
plot(smpltime,vib,'b',smpltime,90*rev-45,'r');
fs = 100;
iNum = 4086;
fft_data = vib(1:iNum);
yy =  fft(fft_data);
data_fft =  abs(yy)/iNum*2;
figure()
t2 = (0:1:iNum-1)/fs;
subplot(221);
plot(t2,fft_data);
f2 =  (0:1:iNum-1)/iNum*fs;
subplot(222)
plot(f2,data_fft);
y1 = yy;
y1(300:end-300+1) = 0;
x = real(ifft(y1));
subplot(223)
plot(t2,x);
subplot(224)
plot(f2,abs(fft(x)*2/iNum));
figure()
plot(smpltime(1:iNum),fft_data,'b',smpltime(1:iNum),x,'g',smpltime(1:iNum),90*rev(1:iNum)-45,'r')
rev_interval_index  = find(rev>0);
rev_interval_arr = rev_interval_index(2:end)-rev_interval_index(1:end-1);
interval_max = max(rev_interval_arr);
interval_min = min(rev_interval_arr);
temp_arr = zeros(1,interval_max);
for icnt = interval_min:interval_max
    temp_arr(icnt)= length(find(rev_interval_arr==interval_max));
end
base_frq_seg = max(temp_arr);
base_frq = find(temp_arr == base_frq_seg);
interval_arr = find(rev_interval_arr==base_frq);
interval = rev_interval_index(interval_arr);
arr = zeros(length(interval),base_frq);
for iNum = 1:length(interval)
    arr(iNum,:)= vib(interval(iNum):(interval(iNum)+base_frq-1));
end
arr_mean= mean(arr);
figure();
plot(arr_mean,'b'); 
t3 = 0:0.01:0.99;
std_sin = sin(t3*2*pi);
cmp_sin = [std_sin(1:end-1),std_sin];
mytemp = zeros(100,1);
for iN = 1:100
    mytemp(iN) = sin(t3*2*pi+(iN-1)/100*2*pi)*arr_mean';
end
figure
plot(mytemp);
[cmp_max_val,cmp_max_pos] = max(mytemp);
phase1 = (cmp_max_pos-1)/100*360
figure
ans_sin = sin(t3*2*pi+phase1/180*pi);
tt3= 0:99;
plot(tt3,arr_mean/max(abs(arr_mean)),'b',tt3,ans_sin,'r');

为完成,看经过滤波求相位和不经过滤波求相位的差别。
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值