matlabfft源碼
A. 快速傅立葉變換FFT的matlab源程序
function X=myfft(x)
%myfft函數 用遞歸實現
N=length(x);
t=log2(N);
t1=floor(t);
t2=ceil(t);
if t1~=t2; %若x的長度N不為2的整數次冪,則補0至最接近的2的整數次冪
x=[x zeros(1,2^t2-N)];
N=2^t2;
end
w0=exp(-j*2*pi/N);
X=zeros(1,N);
if N==2
X(1)=x(1)+x(2);
X(2)=x(1)-x(2);
else
n=1:N/2;
xe(n)=x(2*n-1);
xo(n)=x(2*n);
XE=myfft(xe); %遞歸調用
XO=myfft(xo);
for n=1:N/2
X(n)=XE(n)+XO(n)*(w0^(n-1));
X(n+N/2)=XE(n)-XO(n)*(w0^(n-1));
end
end
先輸入x的值,如x=[1,2,3,4,5,6,7,8]
將文件名改為myfft,再調用myfft(x),比較與fft(x)的結果。
B. 16點基四fft演算法編程MATLAB程序,MATLAB源代碼列出如下,運行出錯,請問問題出在哪裡
Attempt to execute SCRIPT lab_3_fft_4_16 as a function.
你把腳本用成了函數,
你把文件名改一下,並且文件要放在MATLAB工作目錄。
C. 求matlab中fft函數的源代碼
一般是用:type 函數名,但有些是看不到的比如fft,sin等。
給你個c++實現的fft
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
const double PI = 3.14159265358979323846;
int n; // 數據個數 = 2的logn次方
int logn;
/// 復數結構體
struct stCompNum
{
double re;
double im;
};
stCompNum* pData1 = NULL;
stCompNum* pData2 = NULL;
/// Examda提示: 正整數位逆序後輸出
int reverseBits(int value, int bitCnt)
{
int i;
int ret = 0;
for(i=0; i<bitCnt; i++)
{
ret |= (value & 0x1) << (bitCnt - 1 - i);
value >>= 1;
}
return ret;
}
void main()
{
ifstream fin("data.txt");
int i,j,k;
// input logn
fin>>logn;
// calculate n
for(i=0, n=1; i<logn; i++) n *= 2;
// malloc memory space
pData1 = new stCompNum[n];
pData2 = new stCompNum[n];
// input raw data
for(i=0; i<n; i++) fin>>pData1[i].re;
for(i=0; i<n; i++) fin>>pData1[i].im;
// FFT transform
int cnt = 1;
for(k=0; k<logn; k++)
{
for(j=0; j<cnt; j++)
{
int len = n / cnt;
double c = - 2 * PI / len;
for(i=0; i<len/2; i++)
{
int idx = len * j + i;
pData2[idx].re = pData1[idx].re + pData1[idx + len/2].re;
pData2[idx].im = pData1[idx].im + pData1[idx + len/2].im;
}
for(i=len/2; i<len; i++)
{
double wcos = cos(c * (i - len/2));
double wsin = sin(c * (i - len/2));
int idx = len * j + i;
stCompNum tmp;
tmp.re = pData1[idx - len/2].re - pData1[idx].re;
tmp.im = pData1[idx - len/2].im - pData1[idx].im;
pData2[idx].re = tmp.re * wcos - tmp.im * wsin;
pData2[idx].im = tmp.re * wsin + tmp.im * wcos;
}
}
cnt <<= 1;
stCompNum* pTmp = NULL;
pTmp = pData1;
pData1 = pData2;
pData2 = pTmp;
}
// resort
for(i=0; i<n; i++)
{
int rev = reverseBits(i, logn);
stCompNum tmp;
if(rev > i)
{
tmp = pData1[i];
pData1[i] = pData1[rev];
pData1[rev] = tmp;
}
}
// output result data
for(i=0; i<n; i++) cout<<pData1[i].re<<"\t";
cout<<endl;
for(i=0; i<n; i++) cout<<pData1[i].im<<"\t";
cout<<endl;
// free memory space
delete []pData1;
delete []pData2;
fin.close();
system("pause");
}
D. 如何查看matlab fft函數源代碼
function xn=myfft(x) N=length(x); M=log2(N); xtmp=zeros(1,N); value=zeros(1,M); for i=0:N-1 repr=i; for t=1:1:M repr=bitshift(i,1-t); value(t)=bitand(repr,1); end pos=0; for k=1:1:M pos=pos+value(k)*2^(M-k); end xtmp(pos+1)=x(i...
E. 如何在matlab上實現FFT
fft是內建函數,不是matlab寫的,看不到源代碼的
下面是我寫的一個fft,可以用
function xn=myfft(x)
N=length(x);
M=log2(N);
xtmp=zeros(1,N);
value=zeros(1,M);
for i=0:N-1
repr=i;
for t=1:1:M
repr=bitshift(i,1-t);
value(t)=bitand(repr,1);
end
pos=0;
for k=1:1:M
pos=pos+value(k)*2^(M-k);
end
xtmp(pos+1)=x(i+1);
end
for i=1:M
deepth=2^(i-1);
width=2^(M-i);
for t=1:2^i:N
for k=1:deepth
tmp=xtmp(t+k-1);
wn=width*(k-1);
xtmp(t+k-1)=tmp+exp(-j*2*pi*wn/N)*xtmp(t+k+deepth-1);
xtmp(t+k+deepth-1)=tmp-exp(-j*2*pi*wn/N)*xtmp(t+k+deepth-1);
end
end
end
xn=xtmp;
望採納!
F. 懸賞20分,尋fft2()源碼,matlab中對任意不等寬高矩陣進行二維傅立葉變換,無2的整數冪限制
command window 輸入:edit fft2即可看到源碼。
非2整次冪規格默認填充
G. MATLAB中fft、qr等函數的源文件怎麼查看
這些應該不是.m文件,比如matlab的fft就是基於fftw的,應該是用c寫的,我猜qr也是用c寫的
H. 要怎麼看Matlab自帶函數的源代碼
MATALB屬於半開源軟體,其中很多函數可以通過「open/edit/type+filename」命令進行編輯和查看源代碼。但是有一些函數僅僅可以找到它的幫助文檔,卻無法看到具體的源代碼,比如min,fft,sum等函數,因為這些函數屬於MATLAB的built-in function(內置函數),即MATLAB的built-in
function的代碼是不公開的,有人說這些函數的演算法是最優化的,保證較低的時間復雜度提高效率,所以,我感覺寫一個演算法優先考慮調用MATLAB自帶函數,自帶函數解決不了的情況下,再自己去寫,畢竟自己寫的代碼的效率無法達到最優。
I. 用matlab編寫實現fft的程序。
function y=myditfft(x)
%本程序對輸入序列實現DIT-FFT基2演算法,點數取大於等於長度的2的冪次
%------------------------------------
%
myditfft.c
%------------------------------------
m=nextpow2(x);
%求的x長度對應的2的最低冪次m
N=2^m;
if length(x)<N
x=[x,zeros(1,N-length(x))];
%若的長度不是2的冪,補0到2的整數冪
end
nxd=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;
end
u=u*WN;
%修改旋轉因子,多乘一個基本DFT因子WN
end
end
J. 哪位大神知道matlab中的do-fft函數的代碼是什麼啊
matlab的fft代碼用的是fftw的庫,是看不到的,不過網上有開源的fftw源代碼。調用例子可以看matlab的幫助。