FPGA-Matlab信号处理笔记

1 ILA读取IQ信号

1.1 解析

ILA抓取IQ信号且valid不连续,或实现抽取时数据不连续,此时用valid判断再读出valid;

将IQ转为实信号,使用complex函数。

将数据读出到工作区时,可直接使用内APP “Signal Analyzer”分析时频。

1.2 代码实现

clc;

clear all;

close all;

im_i = readmatrix('iladata_ad.csv', 'outputtype', 'string'); % 读取string矩阵

re_q = readmatrix('iladata_ad.csv', 'outputtype', 'string'); % 读取string矩阵

% indexs=(double(im_i(:,8))==-1);

im_ddc = im_i((double(im_i(:,10))==1),12); % 取第x列

re_ddc = re_q((double(re_q(:,10))==1),11); % 取第x列

ddc_data_i = str2double(im_ddc);

ddc_data_q = str2double(re_ddc);

data_real = complex(ddc_data_i,ddc_data_q);

fs = 250*1e6 ;

dec =1;

data_iq = ddc_data_i + 1j * ddc_data_q ;

Plot_Freq_Jason(data_iq.',fs/dec,1,'DDC_Plot')

2 插值抽取

2.1 解析说明

插4抽5实现采样率250M降至200M。

2.2 代码实现

clear all;

close all;

k = 4; % 测试插入倍数

fc4 = 200 *1e6; % 2.5 * 4 = 10M% 插值后的采样率

% 插值后的滤波器系数

Fs = 2; % Sampling Frequency

Fpass = 0.10; % Passband Frequency  %%注意带宽

Fstop = 0.20; % Stopband Frequency

Dpass = 0.0057501127785; % Passband Ripple

Dstop = 0.000000001; % Stopband Attenuation

dens = 20; % Density Factor

[N, Fo, Ao, W] = firpmord([Fpass, Fstop] / (Fs / 2), [1 0], [Dpass,Dstop]);

 fir_n = firpm(N, Fo, Ao, W, {dens});

% 多相滤波器系数 一分四

fir_len = length(fir_n);

fir_n_1 = fir_n(1:4:fir_len);

fir_n_2 = fir_n(2:4:fir_len);

fir_n_3 = fir_n(3:4:fir_len);

fir_n_4 = fir_n(4:4:fir_len);

s = ddc_data_i ;%生成/读取一组AD信号--抽取之前的250M信号

% 多相插值滤波(k = 4)

y_1 = filter(fir_n_1, 1, s) * k;

y_2 = filter(fir_n_2, 1, s) * k;

y_3 = filter(fir_n_3, 1, s) * k;

y_4 = filter(fir_n_4, 1, s) * k;

y_n = [y_1; y_2; y_3; y_4];

yy = y_n(:)';%插值完成

yy1 = yy(1:5:end);%抽5

Plot_Freq_Jason(yy1.',fc4,1,'DDC_Plot')

3 SFNR计算

无杂散动态范围

N = length(data_real); %读取原始AD数据

f = (0:N-1) * (Fs/N)    ; % 频率轴

X= fft(data_real); %信号fft

P = abs(X/N);%功率谱

%计算SFDR : 无杂散动态范围

[~,maxSigidx]  = max(P(1:N));

maxSigpower = P(maxSigidx); %最大信号功率

P(maxSigidx-100:maxSigidx+100) = 0 ; %屏蔽最大信号周围频率

[~,maxSpurIdx] = max(P(1:N/2+1)); %最大信号功率

maxSpurpower = P(maxSpurIdx); %最大杂散功率

SFDR = maxSigpower - maxSpurpower ;

SFDR_dB = 20*log10(SFDR);%转换成dB

fprintf('SFDR =  %ddB\n',SFDR_dB) ;

4 相位计算

4.1 说明

将两通道的数据过拟合成y = a + b * sin(2 * pi * d * t + c)

可得出幅度b、初相c、频率d、直流a;

Δc= (c1 - c2)/pi*180°/180/d;相位差单位us

求取相位差总体思路是:得到两通道的频谱数据,且信号频率一致,使用最小二乘法换成正弦公式,再求取相位差数据。

4.2 代码实现

% 文件读取

ch1 = adc_ch1_data;%自行导入通道数据

ch2 = adc_ch2_data;%自行导入通道数据

fs = 1e6; %采样率

% 初步比较信号是不是一致的

fft_c1 = abs(fft(ch1)); %对两通道数据做FFT

fft_c2 = abs(fft(ch2)); %对两通道数据做FFT

[~, b1] = max(fft_c1(2:end)); %找最大值的位置

[~, b2] = max(fft_c2(2:end)); %找最大值的位置

if (b1 ~= b2)

    error("error: f1 != f2!");

end

% 估算信号上下限

ff = fs / length(ch1);

f_b = b1 * ff; %找到信号频率

f1 = max(0, f_b - ff); %细化起始频率

f2 = f_b + ff; %细化结束频率

% 最小二乘法 拟合y = a + b * sin(2 * pi * d * t + c);

[a1, b1, c1, d1, e1] = sin_t(ch1, fs, f1, f2);

[a2, b2, c2, d2, e2] = sin_t(ch2, fs, f1, f2);

fprintf("CH1 直流:%f,幅值:%f,初相:%f°,频率:%f,标准差:%f\n", a1, b1, c1 / pi * 180, d1, e1);

fprintf("CH2 直流:%f,幅值:%f,初相:%f°,频率:%f,标准差:%f\n", a2, b2, c2 / pi * 180, d2, e2);

% 显示原始数据和拟合数据

t = (0:(length(ch1) - 1)) / fs;

ch1_t = a1 + b1 * cos(2 * pi * d1 * t + c1);

ch2_t = a2 + b2 * cos(2 * pi * d2 * t + c2);

% 计算两通道的相位差

pha_ba_diff = (c1 - c2) / pi * 180;

if (pha_ba_diff < -180)

    pha_ba_diff = pha_ba_diff + 360;

elseif (pha_ba_diff > 180)

    pha_ba_diff = pha_ba_diff - 360;

end

delay_t_diff = pha_ba_diff / 180 / d1; %相位差计算结果,单位为us

if (abs(delay_t_diff) < 1e-9)

    delay_t_diff = delay_t_diff * 1e12;

    delay_t_unit = 'ps';

elseif (abs(delay_t_diff) < 1e-6)

    delay_t_diff = delay_t_diff * 1e9;

    delay_t_unit = 'ns';

elseif (abs(delay_t_diff) < 1e-3)

    delay_t_diff = delay_t_diff * 1e6;

    delay_t_unit = 'us';

elseif (abs(delay_t_diff) < 1)

    delay_t_diff = delay_t_diff * 1e3;

    delay_t_unit = 'ms';

else

    delay_t_unit = 's';

end

fprintf("CH1-CH2 时间差:%f %s\n", delay_t_diff, delay_t_unit);

fprintf("CH1-CH2 相位差:%f °\n", delay_t_diff/(10^12)/(1/1000000)*360);%根据计算的时间差和自身频率周期进行换算

%% functions

function [a,b,c,d,e]=sin_t(y, fs, fl, fh)

% y = a + b*cos(2*pi*d*t + c);

if(length(y(1,:)) ~= 1)

    y = y';

end

N = length(y);

t = ((0:(N-1))/fs)';

cfun = @(d) [ones(size(t)), sin(2*pi*d*t), cos(2*pi*d*t)]\y;

sumerr2 = @(d) sum((y - [ones(size(t)), sin(2*pi*d*t), cos(2*pi*d*t)] * cfun(d)) .^ 2);

dopt = fminbnd(sumerr2, fl, fh);

abb = cfun(dopt);

a = abb(1);

b = norm(abb([2 3]));

c = atan2(-abb(2), abb(3));%求arctan

d = dopt;

e = sqrt(sumerr2(dopt) / N);

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值