频域补零可以实现时域内插,在某些数据插值的应用场景中可能十分有用。频域补零实现时域插值的过程如下面的示意图所示:
下面直接给出示例代码及结果:
clear all; % 清除所有变量
close all; % 关闭所有窗口
clc;
% 设置参数
amplitude = 3; % 信号的幅度
frequency = 5; % 信号的频率
sampling_frequency = 40; % 采样的频率
sampling_num = 40; % 采样数
% 生成时间轴
t = 0:1/sampling_frequency:(sampling_num-1)/sampling_frequency;
figure(),
% 生成信号
signal = amplitude * cos(2 * pi * frequency * t + pi / 3);
subplot(3,1,1);
plot(signal,'ro');
hold on
plot(signal,'r');
legend('原始信号','Fontsize',18);
% 计算FFT和iFFT
fft_result = fft(signal);
ifft_result = ifft(fft_result);
subplot(3,1,2);
plot(ifft_result,'bo');
hold on
plot(ifft_result,'b');
legend('原始信号直接fft后执行ifft','Fontsize',18);
% 频域补零实现的时域内插, K= 2表示时域信号量增加至原来的两倍
K = 2;
N = length(fft_result);
fft_result_1 = K * [fft_result(1 : N / 2), zeros(1, (K - 1) * N), fft_result(N / 2 + 1: N)];
ifft_result_1 = ifft(fft_result_1);
subplot(3,1,3);
plot(real(ifft_result_1),'go');
hold on
plot(real(ifft_result_1),'g');
legend('原始信号fft后高频部分补零再执行ifft','Fontsize',18);
频域补零后执行ifft,实现了时域内插。目的达成。
频域补零后执行ifft,本质相当于时域执行sinc插值,后续有时间再补充。