1樓:匿名使用者
function y=myditfft(x)
%本程式對輸入序列實現dit-fft基2演算法,點數取大於等於長度的2的冪次
%------------------------------------
%myditfft.c
%------------------------------------
m=nextpow2(x);
%求的x長度對應的2的最低冪次m
n=2^m;
if length(x) x=[x,zeros(1,n-length(x))]; %若的長度不是2的冪,補0到2的整數冪 endnxd=bin2dec(fliplr(dec2bin([1:n]-1,m)))+1; %求1:2^m數列的倒序 y=x(nxd); %將倒序排列作為的初始值 for mm=1:m %將dft做m次基2分解,從左到右,對每次分解作dft運算 nmr=2^mm; u=1; %旋轉因子u初始化 wn=exp(-i*2*pi/nmr); %本次分解的基本dft因子wn=exp(-i*2*pi/nmr) for j=1:nmr/2 %本次跨越間隔內的各次碟形運算 for k=j:nmr:n %本次碟形運算的跨越間隔為nmr=2^mm kp=k+nmr/2; %確定碟形運算的對應單元下標 t=y(kp)*u; %碟形運算的乘積項 y(kp)=y(k)-t; %碟形運算的加法項 y(k)=y(k)+t; endu=u*wn; %修改旋轉因子,多乘一個基本dft因子wn endend 2樓:匿名使用者 matlab的fft是內建**,可以找比較低端版本的,比如6.5等,應該會有相應的原始碼。 matlab程式設計實現傅立葉變換 3樓:段山斯清婉 n=1:1000; %時域資料點數 y=a; %a是一千個點數的資料向量 。需要輸入或者貼上。 yf=fft(y); %快速傅立葉變換 ya=abs(yf(1:1000)); %幅值yp=angle(yf(1:1000))%相位plot(n,ya); %繪圖plot(n,yp); 4樓:匿名使用者 t=0:2.5e-6:5.0e-3 %時域點y=2.0e7*sin(2*pi*25000*t) %正弦訊號yf=fft(y)%快速傅立葉變換 magf=abs(yf)*2/2001%幅值fs=(0:2000)*400000/2001%頻率plot(fs,magf)%繪圖 %%%%%%%%你的程式大大的有問題 你求的是正弦訊號抽樣序列的fft,首先要整週期取樣,然後如果想求單邊譜的話,fft後要乘以2/n,如果是雙邊譜的話除以n,另外fft點數最好是以2為基底的,這樣才能突出fft的效率,給個典型程式你去自己看: fs=1024; %取樣頻率n=1024; %取樣點數t=(0:n-1)/fs; %取樣時間序列sf=30; %設定訊號頻率hzx=cos(2*pi*f*t); %生成訊號subplot(211); plot(t,x); xlabel('t/s'); xf=fft(x,n)/n; xf=fftshift(xf); %雙邊複數譜df=fs/n; %頻率解析度hz%繪製雙邊幅值譜 f=(-n/2:n/2-1)*df; %頻域序列subplot(212); plot(f,abs(xf)); xlabel('f/hz'); 5樓:匿名使用者 function [a,b,f]=fseries(f,x,n,a,b) if nargin==3, a=-pi; b=pi; end l=(b-a)/2; if a+b, f=subs(f,x,x+l+a); end%變數區域互換 a=int(f,x,-l,l)/l; b=; f=a/2; %計算a0 for i=1:n an=int(f*cos(i*pi*x/l),x,-l,l)/l; bn=int(f*sin(i*pi*x/l),x,-l,l)/l; a=[a, an]; b=[b,bn]; f=f+an*cos(i*pi*x/l)+bn*sin(i*pi*x/l); endif a+b, f=subs(f,x,x-l-a); end %換回變數區域 6樓:海藍_風 matlab中fft有1d和2d的,fft得到的是訊號的頻譜即t-》f 如 clear %編寫駱遙 fs=1000 t=0:1/fs:0.6; f1=100; f2=300; x=sin(2*pi*f1*t)+sin(2*pi*f2*t); subplot(711) plot(x); title('f1(100hz)\f2(300hz)的正弦訊號,初相0') xlabel('序列(n)') grid on .... 參考資料 7樓:匿名使用者 直接fft就行了 y=fft(y); 如果想加窗, y=fft(y.*hann(length(y))); ts=t(2)-t(1); fs=1/ts; l=length(y); f=-fs/2:fs/l:fs/2-fs/l; plot(f,abs(fftshift(y))); 沒看明白你**,全不全 如何用matlab實現fft 8樓: % fft實踐及頻譜分析 % %***************1.正弦波****************% fs=100;%設定取樣頻率 n=128; n=0:n-1; t=n/fs; f0=10;%設定正弦訊號頻率 x=sin(2*pi*f0*t); %生成正弦訊號 figure(1); subplot(231); plot(t,x);%作正弦訊號的時域波形 xlabel('t'); ylabel('y'); title('正弦訊號y=2*pi*10t時域波形'); grid; %進行fft變換並做頻譜圖 y=fft(x,n);%進行fft變換 mag=abs(y);%求幅值 f=(0:length(y)-1)'*fs/length(y);%進行對應的頻率轉換 figure(1); subplot(232); plot(f,mag);%做頻譜圖 axis([0,100,0,80]); xlabel('頻率(hz)'); ylabel('幅值'); title('正弦訊號y=2*pi*10t幅頻譜圖n=128'); grid; %求均方根譜 sq=abs(y); figure(1); subplot(233); plot(f,sq); xlabel('頻率(hz)'); ylabel('均方根譜'); title('正弦訊號y=2*pi*10t均方根譜'); grid; %求功率譜 power=sq.^2; figure(1); subplot(234); plot(f,power); xlabel('頻率(hz)'); ylabel('功率譜'); title('正弦訊號y=2*pi*10t功率譜'); grid; %求對數譜 ln=log(sq); figure(1); subplot(235); plot(f,ln); xlabel('頻率(hz)'); ylabel('對數譜'); title('正弦訊號y=2*pi*10t對數譜'); grid; %用ifft恢復原始訊號 xifft=ifft(y); magx=real(xifft); ti=[0:length(xifft)-1]/fs; figure(1); subplot(236); plot(ti,magx); xlabel('t'); ylabel('y'); title('通過ifft轉換的正弦訊號波形'); grid; 9樓: 那你去網上找code啊。。。。。有很多這種code的說,當然不一定用matlab編寫的 matlab中使用fft進行諧波分析的程式
200 10樓:匿名使用者 參考%二.fft應用舉例 %例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。取樣頻率fs=100hz,分別繪製n=128、1024點幅頻圖。 clf; fs=100;n=128; %取樣頻率和資料點數 n=0:n-1; t=n/fs; %時間序列 x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %訊號 y=fft(x,n); %對訊號進行快速fourier變換 mag=abs(y); %求得fourier變換後的振幅 f=n*fs/n; %頻率序列 subplot(2,2,1),plot(f,mag); %繪出隨頻率變化的振幅 xlabel('頻率/hz'); ylabel('振幅');title('n=128');grid on; subplot(2,2,2),plot(f(1:n/2),mag(1:n/2)); %繪出nyquist頻率之前隨頻率變化的振幅 xlabel('頻率/hz'); ylabel('振幅');title('n=128');grid on; %對訊號取樣資料為1024點的處理 fs=100;n=1024;n=0:n-1;t=n/fs; x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %訊號 y=fft(x,n); %對訊號進行快速fourier變換 mag=abs(y); %求取fourier變換的振幅 f=n*fs/n; subplot(2,2,3),plot(f,mag); %繪出隨頻率變化的振幅 xlabel('頻率/hz'); ylabel('振幅');title('n=1024');grid on; subplot(2,2,4) plot(f(1:n/2),mag(1:n/2)); %繪出nyquist頻率之前隨頻率變化的振幅 xlabel('頻率/hz'); ylabel('振幅');title('n=1024');grid on; %執行結果: %fs=100hz,nyquist頻率為fs/2=50hz。整個頻譜圖是以nyquist頻率為對稱軸的。並且可以明顯識別出訊號中含有兩種頻率成 %分:15hz和40hz。由此可以知道fft變換資料的對稱性。因此用fft對訊號做譜分析,只需考察0~nyquist頻率範圍內的福頻特性。若沒有給 %出取樣頻率和取樣間隔,則分析通常對歸一化頻率0~1進行。另外,振幅的大小與所用取樣點數有關,採用128點和1024點的相同頻率的振幅是有不同的表 %現值,但在同一幅圖中,40hz與15hz振動幅值之比均為4:1,與真實振幅0.5:2是一致的。為了與真實振幅對應,需要將變換後結果乘以2除以n。 include define n 10 假設n為來10 main 累加正dao數 輸出結果 getch 沒有注意到scanf 和getchar 的區別 前者不接受空格,後者接收空格。當輸入1 空格 內2 空格 3 空格 4 回車容 時,數字1被getchar 吃掉了 接下來scanf忽略1和2之間的... 在matlab中做fft,首先編寫函式,對不同的取樣頻率和取樣點數,計算fft後的頻率序列及其對應的幅值 function f amplitude yopheefft samplerate,fft points n 0 fft points 1 t n samplerate 取樣時間序列 f all... function z f x,y z x.2 sin x y 2 y f x,y x 2 sinxy 2y 如何用matlab編寫程式輸入x輸出y?x input 輸入x y input 輸入y f x 2 sin x y 2 y disp f 這樣就可以了 你可以試試 1.有一個函式 f x,y ...用C語言編寫實現輸入n個實數,並分別統計正數的和及負數的和
matlab中的fft的取樣頻率和取樣點怎樣確定
怎麼用MATLAB編寫fx,yx2sinxy2y