【问题标题】:frequency domain interpolation changes the signal spectrum频域插值改变信号频谱
【发布时间】:2014-12-09 16:41:19
【问题描述】:

我正在研究一些与正弦扫描激励相关的实验数据。

我首先使用从数据文件中获得的幅度和频率信息重构了信号:

% finz: frequency
% ginz: amplitude
R = 4; % sweep rate
tz = 60/R*log2(finz/finz(1)); % time
u_swt = sin(2*pi*((60*finz(1)/(R*log(2.))*(2.^(R/60*tz)-1))));
time_sign = ginz.*u_swt;
freq_sign = fft(time_sign);

这是我得到的:

然后我尝试在计算时间信号之前插入频率数据以获得“更好”的信号(具有更多样本应该更容易重建它):

ginz = interp(ginz,200);
finz = interp(finz,200);

但现在光谱发生了变化:

为什么频谱如此不同?我在插值中做错了吗?我不应该插入数据吗?

【问题讨论】:

    标签: matlab fft interpolation frequency


    【解决方案1】:

    我不清楚您正在使用的信号的详细信息。例如,您能否提供典型的finz 和ginz 示例?此外,还不清楚您希望通过插值实现什么,因此很难就其使用提出建议。

    但是,如果您对时间序列进行插值,您应该期望它的频谱会随着它增加采样频率而发生变化。相对于新的采样频率,内插信号的频率将变得更小。因此,信号频谱将(这里不是很专业)推向零。我在下面提供了一个脚本,它创建了高斯白噪声,并绘制了不同插值级别的频谱。在没有插值的第一个子图中,频谱被均匀占据(通过设计 - 白噪声)。在随后的子图中,随着插值的增加,占用的频谱变得越来越小。希望这会有所帮助。

    % white Gaussian noise (WGN)
    WGN = randn(1,1000);
    % DFT of WGN
    DFT_WGN = abs(fft(WGN));
    % one-sided spectrum
    DFT_WGN = DFT_WGN(1:length(WGN)/2);
    
    % interpolated WGN by factor of 2 (q = 2)
    WGN_interp_2 = interp(WGN,2);
    % DFT of interpolated WGN
    DFT_WGN_interp_2 = abs(fft(WGN_interp_2));
    % one-sided spectrum
    DFT_WGN_interp_2 = DFT_WGN_interp_2(1:length(DFT_WGN_interp_2 )/2);
    
    % interpolated WGN by factor of 10 (q = 10)
    WGN_interp_10 = interp(WGN,10);
    % DFT of interpolated WGN
    DFT_WGN_interp_10 = abs(fft(WGN_interp_10));
    % one-sided spectrum
    DFT_WGN_interp_10 = DFT_WGN_interp_10(1:length(DFT_WGN_interp_10 )/2);
    
    figure
    subplot(3,1,1)
    plot(DFT_WGN)
    ylabel('DFT')
    subplot(3,1,2)
    plot(DFT_WGN_interp_2)
    ylabel('DFT (q:2)')
    subplot(3,1,3)
    plot(DFT_WGN_interp_10)
    ylabel('DFT (q:10)')
    

    【讨论】:

    • 这是有道理的,我仍然不清楚的是为什么在我的信号中,频谱被分成两部分(一个朝向 0,另一个朝向 100 Hz),而你的全部朝向 0。 finz = [5.0000 5.0003 5.0006 5.0009 5.0012 5.0015 5.0018 5.0021 5.0024 5.0027]ginz = [0.3327 0.3327 0.3327 0.3328 0.3328 0.3328 0.3329 0.3329 0.3329 0.3330]
    • 另一件事,我在计算时间信号之前插入幅度和频率值(ginzfinz)。对它们进行插值后,我会重新计算时间信号tz = 60/R*log2(finz/finz(1)); u_swt = sin(2*pi*((60*finz(1)/(R*log(2.))*(2.^(R/60*tz)-1)))); time_sign = ginz.*u_swt;
    • FFT 运算返回一个双边复值频谱。通常,我们只对这个频谱的绝对值感兴趣。如果原始时间序列是实值的,那么绝对谱中就会有冗余——第一边将反映第二边。因此,标准做法是只考虑频谱的一侧。在线查看有关单面和双面光谱的信息。
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2016-04-25
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多