用matlab編寫實現fft的程式

2022-02-17 01:27:46 字數 6201 閱讀 1221

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。

用C語言編寫實現輸入n個實數,並分別統計正數的和及負數的和

include define n 10 假設n為來10 main 累加正dao數 輸出結果 getch 沒有注意到scanf 和getchar 的區別 前者不接受空格,後者接收空格。當輸入1 空格 內2 空格 3 空格 4 回車容 時,數字1被getchar 吃掉了 接下來scanf忽略1和2之間的...

matlab中的fft的取樣頻率和取樣點怎樣確定

在matlab中做fft,首先編寫函式,對不同的取樣頻率和取樣點數,計算fft後的頻率序列及其對應的幅值 function f amplitude yopheefft samplerate,fft points n 0 fft points 1 t n samplerate 取樣時間序列 f all...

怎麼用MATLAB編寫fx,yx2sinxy2y

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 ...