大一的新生 2023-09-24 20:28 采纳率: 100%
浏览 20
已结题

复数序列傅里叶变换+Matlab

使用Matlab验证结论时得出了错误的结论,以下是题目:
构造一个复数序列:
(a)画出该复数序列的傅里叶变换的实部和虚部,看看是否具有对称性。
(b)画出该序列的实部和虚部的傅里叶变换的实部和虚部,看看是否具有对称性。
(c)比较(a)和(b)的结果,验证二者之间的关系。

以下是我使用的Matlab代码:

s=[-3+4i,3+1i,5+4i,3i,1+2i,-2+1i,-1-1i,-1i,-2i,-3+1i,9+5i];
N=11;            %周期为11
fft_s=fft(s,N);  %进行傅里叶变换
fft_re=real(fft_s);  %取出傅里叶变换的实部
fft_im=imag(fft_s);  %取出傅里叶变换的虚部
figure;
subplot(2,1,1);
stem(fft_re);
title('傅里叶变换的实部');
subplot(2,1,2);
stem(fft_im);
title('傅里叶变换的虚部');
re=real(s);          %取出复数序列的实部
im=imag(s);          %取出复数序列的虚部
re_fft=fft(re,N);      %对实部做傅里叶变换
im_fft=fft(im,N);      %对虚部做傅里叶变换
re_re_fft=real(re_fft);    %取出实部傅里叶变换的实部
im_re_fft=imag(re_fft);    %取出实部傅里叶变换的虚部
re_im_fft=real(im_fft);    %取出虚部傅里叶变换的实部
im_im_fft=imag(im_fft);    %取出虚部傅里叶变换的虚部
figure;
subplot(2,1,1);
stem(re_re_fft);
title('实部的傅里叶变换的实部');
subplot(2,1,2);
stem(im_re_fft);
title('实部的傅里叶变换的虚部');
figure;
subplot(2,1,1);
stem(re_im_fft);
title('虚部的傅里叶变换的实部');
subplot(2,1,2);
stem(im_im_fft);
title('虚部的傅里叶变换的虚部');

正确的结论应该是:
1.复数序列傅里叶变换的实部 = 序列实部傅里叶变换的实部 + 序列虚部傅里叶变换的实部
2.复数序列傅里叶变换的虚部 = 序列虚部傅里叶变换的虚部 + 序列实部傅里叶变换的虚部
而我的代码得出的结论却是:
1.复数序列傅里叶变换的实部 = 序列实部傅里叶变换的实部 + 序列虚部傅里叶变换的虚部
2.复数序列傅里叶变换的虚部 = 序列实部傅里叶变换的虚部 + 序列虚部傅里叶变换的实部
检查了好多遍感觉代码逻辑没有问题,实在找不到原因了。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-24 21:25
    关注

    引用 皆我百晓生 小程序回复内容作答:
    根据你提供的代码和问题描述,有可能是你代码中傅里叶变换结果的处理方式不正确导致的。在验证二者之间的关系时,你应该使用复数的加法规则,而不是简单地相加或相减实部和虚部。

    以下是修改后的代码,使用复数加法来验证复数序列傅里叶变换结果与实部和虚部分别傅里叶变换结果之间的关系:

    s = [-3+4i, 3+1i, 5+4i, 3i, 1+2i, -2+1i, -1-1i, -1i, -2i, -3+1i, 9+5i];
    N = 11;           % 周期为11
    fft_s = fft(s, N); % 进行傅里叶变换
    
    re = real(s);     % 取出复数序列的实部
    im = imag(s);     % 取出复数序列的虚部
    re_fft = fft(re, N);     % 对实部做傅里叶变换
    im_fft = fft(im, N);     % 对虚部做傅里叶变换
    
    % 使用复数加法规则计算得到复数序列傅里叶变换结果
    fft_comp = re_fft + 1i * im_fft;
    
    % 取出结果的实部和虚部
    fft_comp_re = real(fft_comp);
    fft_comp_im = imag(fft_comp);
    
    % 绘制结果图像
    figure;
    subplot(2,1,1);
    stem(real(fft_s));
    title('复数序列傅里叶变换的实部');
    subplot(2,1,2);
    stem(imag(fft_s));
    title('复数序列傅里叶变换的虚部');
    
    figure;
    subplot(2,1,1);
    stem(fft_comp_re);
    title('序列实部傅里叶变换的实部 + 序列虚部傅里叶变换的实部');
    subplot(2,1,2);
    stem(fft_comp_im);
    title('序列实部傅里叶变换的虚部 + 序列虚部傅里叶变换的虚部');
    

    运行修改后的代码可以得到应该正确的结论,即复数序列傅里叶变换的实部等于序列实部傅里叶变换的实部加上序列虚部傅里叶变换的实部,复数序列傅里叶变换的虚部等于序列实部傅里叶变换的虚部加上序列虚部傅里叶变换的虚部。请检查你的代码是否与此相似,如果还是出现错误的结论,可能是其他问题引起的,你可以进一步检查算法的实现或者数据的准确性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月2日
  • 已采纳回答 9月24日
  • 创建了问题 9月24日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错