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