文章目录
- 数字下变频(DDC)
- 数字上变频(DUC)
- FIR并行滤波
数字下变频(DDC)
有几点需要注意,
- 混频之后,抽取之前,需要设计抗混叠滤波器
- 考虑到硬件实现,滤波器的设计要合理(阶数、系数结构等)
%% 清空一切
clc;clear all;close all;%% 信号参数设置
FS = 3000;
TS = 1/FS;
N = 8192;
f = 500;
t = (0:N-1)*TS;FS_2 = FS/2;
FS_4 = FS/4;
N_2 = N/2;SIG_AMP = 100;
COEF_WIDTH = 16;%%
SIM_SEL = 2;%% 生成中频信号
sig_if = cos(2*pi*f*t);
figure;
subplot(211);
freq = (0:N-1)/N*FS;
plot(freq,20*log10(abs(fft(sig_if))));
title('原始信号频谱图(ffthift之前)');
subplot(212);
freq = (0:N-1)/N*FS-FS/2;
plot(freq,20*log10(abs(fftshift(fft(sig_if)))));
title('原始信号频谱图(ffthift之后)');%% 设计半带滤波器(一半系数为0,便于节省硬件资源)
load filter_coef.mat;
h = floor(2^(COEF_WIDTH-1)*0.9*filter_coef);
fvtool(h);%%
% ===============================================================
% 混频混到零中频后处理(暂不考虑抽取)
% ===============================================================
% part_1 混频到零中频
if SIM_SEL == 1NCO_i = cos(2*pi*f*t);NCO_q = -sin(2*pi*f*t);sig_i_zif = sig_if.*NCO_i;sig_q_zif = sig_if.*NCO_q;figure;subplot(211);freq = (0:N-1)/N*FS-FS/2;plot(freq,20*log10(abs(fft(sig_i_zif+1i*sig_q_zif))));title('混频到零中频的频谱图(ffthift之前)');subplot(212);freq = (0:N-1)/N*FS-FS/2;plot(freq,20*log10(abs(fftshift(fft(sig_i_zif+1i*sig_q_zif)))));title('混频到零中频的频谱图(ffthift之后)');% part_2 低通滤波sig_i = conv(h,sig_i_zif);sig_i = sig_i(1,1:N);sig_q = conv(h,sig_q_zif);sig_q = sig_q(1,1:N);figure;freq = (0:N-1)/N*FS_2-FS/2;plot(freq,20*log10(abs(fftshift(fft(sig_i+1i*sig_q)))));
end% ===============================================================
% 使用0.25*FS进行混频(滤波后再进行抽取,防止频谱混叠)
% ===============================================================
if SIM_SEL == 2% part_1 使用0.25*FS进行混频NCO_i = cos(2*pi*FS_4*t);NCO_q = -sin(2*pi*FS_4*t);sig_i_mif = sig_if.*NCO_i;sig_q_mif = sig_if.*NCO_q;figure;subplot(211);freq = (0:N-1)/N*FS;plot(freq,20*log10(abs(fft(sig_i_mif+1i*sig_q_mif))));title('混频 后的频谱图(ffthift之前)');subplot(212);freq = (0:N-1)/N*FS-FS/2;plot(freq,20*log10(abs(fftshift(fft(sig_i_mif+1i*sig_q_mif)))));title('混频 后的频谱图(ffthift之后)');% part_2 低通滤波 sig_i = conv(h,sig_i_mif);sig_i = sig_i(1,1:N);sig_q = conv(h,sig_q_mif);sig_q = sig_q(1,1:N);figure;subplot(211);freq = (0:N-1)/N*FS;plot(freq,20*log10(abs(fft(sig_i+1i*sig_q))));title('混频-滤波 后的频谱图(ffthift之前)');subplot(212);freq = (0:N-1)/N*FS-FS_2;plot(freq,20*log10(abs(fftshift(fft(sig_i+1i*sig_q)))));title('混频-滤波 后的频谱图(ffthift之前)');% part_3 2倍抽取sig_i_d2 = sig_i(1,1:2:end);sig_q_d2 = sig_q(1,1:2:end);figure;subplot(211);freq = (0:N_2-1)/N_2*FS_2;plot(freq,20*log10(abs(fft(sig_i_d2+1i*sig_q_d2))));title('混频-滤波-抽取 后的频谱图(ffthift之前)');subplot(212);freq = (0:N_2-1)/N_2*FS_2-FS_4;plot(freq,20*log10(abs(fftshift(fft(sig_i_d2+1i*sig_q_d2)))));title('混频-滤波-抽取 后的频谱图(ffthift之后)');
end% ===============================================================
% 使用0.25*FS进行混频(混频后进行两倍抽取)
% 这一部分的仿真标明,在混频之后马上就进行混频是错误的,很可能造成混叠
% 以采样率为3000M,输入信号为500M为例,以0.25*FS进行混频,
% 混频后两个频率分别为-250M(对应2750M),-1250M(对应1750M),
% 两个频点都大于0.5*FS,直接进行2倍抽取会造成信号混叠,之后再进行滤波也
% 得不到错误的结果
% ===============================================================
if SIM_SEL == 3fprintf('这是一个反例,混频后马上进行抽取是错误的!\n')% part_1 使用0.25*FS进行混频NCO_i = cos(2*pi*FS_4*t);NCO_q = -sin(2*pi*FS_4*t);sig_i_mif = sig_if.*NCO_i;sig_q_mif = sig_if.*NCO_q;sig_i_mif_d2 = sig_i_mif(1,1:2:end);sig_q_mif_d2 = sig_q_mif(1,2:2:end);figure;subplot(211);freq = (0:N_2-1)/N_2*FS_2;plot(freq,20*log10(abs(fft(sig_i_mif_d2+1i*sig_q_mif_d2))));title('混频后两倍抽取的频谱图(ffthift之前)');subplot(212);freq = (0:N_2-1)/N_2*FS_2-FS_2/2;plot(freq,20*log10(abs(fftshift(fft(sig_i_mif_d2+1i*sig_q_mif_d2)))));title('混频后两倍抽取的频谱图(ffthift之后)');% part_2 低通滤波sig_i = conv(h,sig_i_mif_d2);sig_i = sig_i(1,1:N_2);sig_q = conv(h,sig_q_mif_d2);sig_q = sig_q(1,1:N_2);figure;freq = (0:N_2-1)/N_2*FS_2-FS_2/2;plot(freq,20*log10(abs(fftshift(fft(sig_i+1i*sig_q)))));
end
运行效果如下图,
数字上变频(DUC)
%% 清空一切
clc;clear all;close all;%% 信号参数设置
FS = 1500;
TS = 1/FS;
N = 4096;
f = 300;
t = (0:N-1)*TS;N_X2 = N*2;
FS_2 = FS/2;
FS_X2 = FS*2;
t_x2 = (0:N_X2-1)*TS;SIG_AMP = 100;
COEF_WIDTH = 16;%%
SIM_SEL = 2;%% 生成IQ信号
sig_i = cos(2*pi*f*t);
sig_q = sin(2*pi*f*t);
figure;
subplot(211);
freq = (0:N-1)/N*FS;
plot(freq,20*log10(abs(fft(sig_i + 1i*sig_q))));
title('IQ信号频谱图(ffthift之前)');
subplot(212);
freq = (0:N-1)/N*FS-FS/2;
plot(freq,20*log10(abs(fftshift(fft(sig_i + 1i*sig_q)))));
title('IQ信号频谱图(ffthift之后)');%% 设计半带滤波器(一半系数为0,便于节省硬件资源)
load filter_coef.mat;
h = floor(2^(COEF_WIDTH-1)*0.9*filter_coef);
% fvtool(h);% ===============================================================
%
% ===============================================================
if SIM_SEL == 2% part_1 2倍插值sig_i_m2 = zeros(1,N_X2);sig_q_m2 = zeros(1,N_X2);sig_i_m2(1,1:2:end) = sig_i;sig_q_m2(1,1:2:end) = sig_q;figure;subplot(211);freq = (0:N_X2-1)/N_X2*FS_X2;plot(freq,20*log10(abs(fft(sig_i_m2+1i*sig_q_m2))));title('插值 后的频谱图(ffthift之前)');subplot(212);freq = (0:N_X2-1)/N_X2*FS_X2-FS;plot(freq,20*log10(abs(fftshift(fft(sig_i_m2+1i*sig_q_m2)))));title('插值 后的频谱图(ffthift之后)');% part_2 低通滤波 sig_i_lpf = conv(h,sig_i_m2);sig_i_lpf = sig_i_lpf(1,1:N_X2);sig_q_lpf = conv(h,sig_q_m2);sig_q_lpf = sig_q_lpf(1,1:N_X2);figure;subplot(211);freq = (0:N_X2-1)/N_X2*FS_X2;plot(freq,20*log10(abs(fft(sig_i_lpf+1i*sig_q_lpf))));title('插值-滤波 后的频谱图(ffthift之前)');subplot(212);freq = (0:N_X2-1)/N_X2*FS_X2-FS;plot(freq,20*log10(abs(fftshift(fft(sig_i_lpf+1i*sig_q_lpf)))));title('插值-滤波 后的频谱图(ffthift之前)');% part_3 使用0.25*FS_X2进行混频NCO_i = cos(2*pi*FS_2*t_x2);NCO_q = -sin(2*pi*FS_2*t_x2);sig_i_mif = sig_i_lpf.*NCO_i;sig_q_mif = sig_q_lpf.*NCO_q;figure;subplot(211);freq = (0:N_X2-1)/N_X2*FS_X2;plot(freq,20*log10(abs(fft(sig_i_mif+1i*sig_q_mif))));title('混频 后的频谱图(ffthift之前)');subplot(212);freq = (0:N_X2-1)/N_X2*FS_X2-FS;plot(freq,20*log10(abs(fftshift(fft(sig_i_mif+1i*sig_q_mif)))));title('混频 后的频谱图(ffthift之后)');
end
运行效果如下图,
FIR并行滤波
在下图中,由于滤波器的位置已经放在抽取之后了(这意味着无法获得因为抽取而导致的数据率下降的优势),而直接实现结构和多相滤波结构滤波器阶数并没有发生变化,因此两种设计方式的资源消耗量是一样的。
不过,考虑到多相滤波结构能够将一个大的滤波器分解成多个小的滤波器,比较适合模块复用。
一般多相滤波用在多速率转换的场合,能够减小数据率。对于下采样而言,一般是先抽取再滤波;对于上采样而言,一般是先滤波后插值。