公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
5.8k 浏览
如下为MATLAB上的程序

close all; %先关闭所有图片
Adc=2;  %直流分量幅度
A1=3;   %频率F1信号的幅度
A2=1.5; %频率F2信号的幅度
F1=50;  %信号1频率(Hz)
F2=75;  %信号2频率(Hz)
Fs=256; %采样频率(Hz)
P1=-30; %信号1相位(度)
P2=90;  %信号相位(度)
N=256;  %采样点数
t=[0:1/Fs:N/Fs]; %采样时刻

%信号
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%显示原始信号
plot(S);
title('原始信号');

figure;
Y = fft(S,N); %做FFT变换
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %显示原始的FFT模值结果
title('FFT 模值');

figure;
Ayy=Ayy/(N/2);   %换算成实际的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %换算成实际的频率值
plot(F(1:N/2),Ayy(1:N/2));   %显示换算后的FFT模值结果
title('幅度-频率曲线图');

figure;
Pyy=[1:N/2];
for i="1:N/2"
Pyy(i)=phase(Y(i)); %计算相位
Pyy(i)=Pyy(i)*180/pi; %换算为角度
end;
plot(F(1:N/2),Pyy(1:N/2));   %显示相位图
title('相位-频率曲线图');
 

我自己使用Mathematica不知道怎么做FFT变换,使用Fourier函数得到的结果和MATLAB差距很大,不知道什么原因,求大神解答。
分类:函数 | 用户: czdhit (21 分)
看看 Fourier 的选项 FourierParameters 。

1个回答

+6 投票
(*真是很久没看FFT那些东西了,很多都快忘l*)
s = 2 + 3*Cos[2*Pi*50*# + Pi*(-30)/180] + 
     1.5*Cos[2*Pi*75*# + Pi*90/180] & /@ Range[0, 1, 1/256];
ListLinePlot[s]

Y = Fourier[s, FourierParameters -> {1, -1}];
Ayy = Abs[Y];
ListLinePlot[Ayy, PlotRange -> All]

Ayy = Ayy/(256/2);
Ayy[[1]] = Ayy[[1]]/2;
F = (Range[1, 256] - 1)*256/256;
data = Transpose[{Take[F, 128], Take[Ayy, 128]}];
ListLinePlot[data, PlotRange -> Full]

 

(*相位我就懒的弄了*)

用户: online (261 分)
没看懂Fourier的参数是干什么的,搬来的这个例子是在MATLAB论坛上面找出来的,多谢你的解答!
这个参数是为了得到符合学校教的傅里叶变换的定义的结果
我用Arg函数对Y求相角为何在51点处相角不是-30度呢?是5度左右,而且Y的结果和MATLAB的也大不相同,Y[[51]]=359.979 + 33.6015 I,MATLAB里面是332.55-192I,新手求解?
是否不能直接对Y用幅角函数呢,还是MATHEMATICA内的傅立叶变换出来的复数不能直接作为改点频率的相角?谢谢!
那是因为我做的FFT点数和你不一样,你把你的t=[0:1/Fs:N/Fs]; %采样时刻
改成t=[0:1/Fs:(N-1)/Fs];和我的Range[0, 1, 1/256];改成Range[0,1-1/256,1/256]这样我们做的FFT点数就一样了
可以直接Arg啊,只是我不是说了吗,我懒的继续写啊,你看到幅度得相位的也会写了啊
谢谢,我自己再试试!(努力凑够12哥字符的尾巴)
...