中级会员
 
- 积分
- 429
- 金钱
- 429
- 注册时间
- 2019-5-15
- 在线时间
- 52 小时
|
1金钱
最近做一个项目,需要准确的测量2个正弦信号的相位差,用STM32F407VG的2路ADC做数据采样,利用407的DMA连续对2路ADC轮流采样,采样频率大约500KHZ,采样点数为2048点,信号频率在30K-40KHZ,为了减小频谱泄漏,准备采用全相FFT(APFFT)对采样信号进行处理,每采完4096个点(因为2路ADC轮流)DMA停止采样然后做全相FFT变换,计算两路信号在峰值处的相位,然后将两路相位相减得到相位差,开始在MATLAB上用2个函数模拟是正常的,然后改用实际测到2路ADC的数据加载运算后发现相位差很多次是一样的,但经常随着采样数据的改变而改变,如果你固定2个采样文件,数据肯定是固定的,但当我更换不同次的采样数据时,发现得到的相位差有时是不一样的,以下是我的MATLAB的程序,由于本人之前也没用过MATLAB,很多是参考网上的算法,加上自己学习理解的知识,所以错误在所难免,希望有大神可以指导一下问题出在哪里,或有兴趣的朋友可以一起讨论一下。
%读取外部的TXT文件的数据并做处理
clc;
Fs = 50e3; % 采样频率
T = 1/Fs; % 采样周期(周期=1/频率)
N = 1024;
L = 2048; % 信号长度,2048
ss1=importdata('sin_adc.txt');
ss2=importdata('sin_adc2.txt');
ss1=ss1( ';
ss2=ss2( ';
%subplot(2,1,1);
%plot(wave_data);
ss1=ss1*3.3/4096; %2N个数据
ss2=ss2*3.3/4096;
win=hann(N)';
%plot(win);
%plot(win1);
win2=conv(win,win); %win和win1的卷积
win2=win2/sum(win2);
s1=ss1(1:2*N-1); %第1组(2N-1)个数据
y1=s1.*win2;
y1a=y1(N:end)+[0 y1(1:N-1)];
out1=fft(y1a,N);
a1=abs(out1);
[m,p]=max(a1(3:100))
pha1=angle(out1(p+2))*180/pi
%p1=mod(phase(out1),2*pi);
s2=ss2(1:2*N-1); %第1组(2N-1)个数据
y2=s2.*win2;
y2a=y2(N:end)+[0 y2(1:N-1)];
out2=fft(y2a,N);
a2=abs(out2);
[m1,p1]=max(a2(3:100))
pha2=angle(out2(p1+2))*180/pi
pha2-pha1
%p2=mod(phase(out1),2*pi);
以上算法我也转为C语言测试过,结果是一样的,看看哪位大神能帮忙分析一下,或有兴趣的朋友可以一起讨论一下,在此表示感谢!
|
|