matlabfft去中心化
① (高分求助)用Matlab,怎麼用FFT變換(傅立葉變換)將一時域數據變換到頻域
s=importdata('s.txt');
y=fft(s,1024); %引入1024,是因為2的整數次冪點的FFT更好做一點,調用這個函數相當於將長度為1000的s補零至1024個點,做1024點FFT,效果等效於頻域增加采樣點
pyy=y.*conj(y); %不相當於ppy=abs(y),相當於ppy=abs(y).^2
f=10000*(0:512)/1024; %設定橫坐標尺度,提醒一下樓主,10E-7對應的1E-6,你的意思應該是1E-7吧.因為橫坐標以1kHz為單位,採用頻率應該是10000kHz,所以10000代表的是這個意思,FFT最中間的點(以0開頭的512點或者以1開頭的513點)代表了一半采樣頻率的頻率分量.
plot(f,pyy(1:513),'.-'); %繪制命令,如果要達到左圖的頻率范圍,建議採用plot(f(1:25),pyy(1:25),'.-'),但是可以看到繪制的點數太少.
因此個人建議採用如下的語句
s=importdata('s.txt');
y=fft(s,10000);
pyy=y.*conj(y);
f=10000*(0:250)/10000;
plot(f(1:251),pyy(1:251),'.-');
因為沒有s的原始數據,沒法給你畫圖,猜測是加了哈寧窗的正弦信號.
② 如何使用Matlab,對一組數據進行FFT變換,得到頻譜分析,萬分感謝。
看看下面的程序,應該能幫上你的忙,已經通過調試:
Fs=256; %采樣頻率(Hz)
N=256; %采樣點數
t=[0:1/Fs:N/Fs]; %采樣時刻
S=2+3*cos(2*pi*10*t+pi*30/180)+cos(2*pi*20*t+pi*90/180);
%我的調試信號,你自己是電流電壓數據的話,最開始通過load指令載入就是
Y = fft(S,N); %做FFT變換
Ayy = abs(Y); %取模
Ayy=Ayy/(N/2); %換算成實際的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %換算成實際的頻率值,Fn=(n-1)*Fs/N
stem(F(1:N/2),Ayy(1:N/2)); %顯示換算後的FFT模值結果
title('幅度-頻率曲線圖');
③ 如何去除matlab中fft的對稱頻譜
FFT的頻譜本身就是對稱的,一般畫頻譜圖時取前半部分就行。
④ matlab中如何對一組數據進行fft變換後得到頻譜圖
1、直接對其使用ceil函數,可以向上取整:即大於等於給定數據的最小整數。
⑤ MATLAB fft變換,橫坐標為頻率
matlab FFT 橫坐標問題:前人關於FFT橫坐標的詳細闡述
我們知道Fourier分析是信號處理里很重要的技術,matlab提供了強大的信號處理能力,但是有一些細節部分需要我們注意。
記信號f(t)的起始時間為t_start, 終止時間為t_end, 采樣周期為t_s, 可以計算信號的持續時間Duration為 t_end – t_start, 信號離散化造成的采樣點數 N = Duration/t_s + 1;
根據Fourier分析的相關結論,我們知道時域的采樣將會造成頻域的周期化,該周期為采樣頻率f_s(著名的香農采樣定理基於此).
於是, 經過matlab的fft函數處理後,得到數據的橫坐標為0:f_s/(N-1):f_s。相關代碼如下所示:
%matlab fft 測試代碼
t_s = 0.01;
t_start = 0.5; t_end = 5;
t = t_start:t_s:t_end;
y = 0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y_f = fft(y);
subplot(3,1,1);
plot(t,y); title('original signal');
Duration = t_end - t_start;
Sampling_points = Duration/t_s + 1;
f_s = 1/t_s;
f_x = 0:f_s/(Sampling_points-1):f_s;
subplot(3,1,2);
plot(f_x,abs(y_f)); title('fft transform');
subplot(3,1,3);
plot(f_x-f_s/2,abs(fftshift(y_f))); title('shift fft transform');
也就是說,如果我們不使用fftshift,其變換後的橫坐標為0:f_s/(N-1):f_s,如果使用fftshift命令,0頻率分量將會移到坐標中心,這也正是matlab中幫助中心給出的意思:對fft的坐標進行了處理。實際上由於頻譜的周期性,我們這樣做是合理的,可以接受的。
⑥ 關於matlab的FFT不懂! 急!!!!!!!!!
1 、一般頻域的采樣點要大於時域的采樣點,最好是2的冪數,便於計算。可以看看數字信號處理這類的書 2、 假設采樣頻率為Fs,信號頻率F,采樣點數為N。那麼FFT之後結果就是一個為N點的復數。每一個點就對應著一個頻率點。這個點的模值,就是該頻率值下的幅度特性。具體跟原始信號的幅度有什麼關系呢?假設原始信號的峰值為A,那麼FFT的結果的每個點(除了第一個點直流分量之外)的模值就是A的N/2倍 所以這里應該是 3 linspace(x0,x1,n) 其中n代表的是點的數目,即分成n-1等分。其實Fs/2*linspace(0,1,NFFT/2+1);就是在0到1之間分成NFFT/2份,也就是FS/NFFT,也就是設置間隔點的頻率。最後2*abs(Y(1:NFFT/2+1)) 因為前面Y = fft(x,NFFT)/ NFFT 是原來信號的二分之一 所以要乘以2
假設FFT之後某點n用復數a+bi表示,那麼這個復數的模就是
An=根號a*a+b*b,相位就是Pn=atan2(b,a)。根據以上的結果,
就可以計算出n點(n≠1,且n<=N/2)對應的信號的表達式為:
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。
對於n=1點的信號,是直流分量,幅度即為A1/N。
由於FFT結果的對稱性,通常我們只使用前半部分的結果,
即小於采樣頻率一半的結果。
⑦ MATLAB用FFT和IFFT對實驗數據除噪(如除去零點漂移)的原理
首先用FFT對實驗數據進行頻譜分析,找到你所需要信號的頻率范圍和雜訊的頻率范圍,然後將雜訊頻段全部置零,最後將去噪後的信號進行IFFT,還原信號。
⑧ matlab里有什麼工具箱,可以用FFT(快速傅立葉變換)做頻譜分析
1、采樣數據導入Matlab 。
采樣數據的導入至少有三種方法。
第一就是手動將數據整理成Matlab支持的格式,這種方法僅適用於數據量比較小的采樣。
第二種方法是使用Matlab的可視化交互操作,具體操作步驟為:File --> Import Data,然後在彈出的對話框中找到保存采樣數據的文件,根據提示一步一步即可將數據導入。這種方法適合於數據量較大,但又不是太大的數據。
第三種方法,使用文件讀入命令。數據文件讀入命令有textread、fscanf、load等,如采樣數據保存在txt文件中,則推薦使用 textread命令。如[a,b]=textread('data.txt','%f%*f%f'); 這條命令將data.txt中保存的數據三個三個分組,將每組的第一個數據送給列向量a,第三個數送給列向量b,第二個數據丟棄。命令類似於C語言,詳細可查看其幫助文件。文件讀入命令錄入采樣數據可以處理任意大小的數據量,且錄入速度相當快,一百多萬的數據不到20秒即可錄入。
2、對采樣數據進行頻譜分析 。
頻譜分析自然要使用快速傅里葉變換FFT了,對應的命令即 fft ,簡單使用方法為:Y=fft(b,N),其中b即是采樣數據,N為fft數據采樣個數。一般不指定N,即簡化為Y=fft(b)。Y即為FFT變換後得到的結果,與b的元素數相等,為復數。以頻率為橫坐標,Y數組每個元素的幅值為縱坐標,畫圖即得數據b的幅頻特性;以頻率為橫坐標,Y數組每個元素的角度為縱坐標,畫圖即得數據b的相頻特性。典型頻譜分析M程序舉例如下: clc fs=100;
t=[0:1/fs:100];
N=length(t)-1;%減1使N為偶數 %頻率解析度F=1/t=fs/N
p=1.3*sin(0.48*2*pi*t)+2.1*sin(0.52*2*pi*t)+1.1*sin(0.53*2*pi*t)... +0.5*sin(1.8*2*pi*t)+0.9*sin(2.2*2*pi*t);
%上面模擬對信號進行采樣,得到采樣數據p,下面對p進行頻譜分析
figure(1) plot(t,p); grid on
title('信號 p(t)'); xlabel('t') ylabel('p') Y=fft(p);
magY=abs(Y(1:1:N/2))*2/N; f=(0:N/2-1)'*fs/N; figure(2)
%plot(f,magY);
h=stem(f,magY,'fill','--');
set(h,'MarkerEdgeColor','red','Marker','*') grid on
title('頻譜圖 (理想值:[0.48Hz,1.3]、[0.52Hz,2.1]、[0.53Hz,1.1]、[1.8Hz,0.5]、[2.2Hz,0.9]) '); xlabel('f (Hz)') ylabel('幅值')
對於現實中的情況,采樣頻率fs一般都是由采樣儀器決定的,即fs為一個給定的常數;另一方面,為了獲得一定精度的頻譜,對頻率解析度F有一個人為的規定,一般要求F<0.01,即采樣時間ts>100秒;由采樣時間ts和采樣頻率fs即可決定采樣數據量,即采樣總點數N=fs*ts。這就從理論上對采樣時間ts和采樣總點數N提出了要求,以保證頻譜分析的精準度。
⑨ 如何使用Matlab,對一組數據進行FFT變換,求得基波分量
x = load('data.dat'); %load 數據
fs=10000; % 采樣頻率,自己根據實際情況設置
N=length(x); % x 是待分析的數據
n=1:N;
%1-FFT
X=fft(x); % FFT
X=X(1:N/2);
Xabs=abs(X);
Xabs(1) = 0; %直流分量置0
for i= 1 : m
[Amax,index]=max(Xabs);
if(Xabs(index-1) > Xabs(index+1))
a1 = Xabs(index-1) / Xabs(index);
r1 = 1/(1+a1);
k01 = index -1;
else
a1 = Xabs(index) / Xabs(index+1);
r1 = 1/(1+a1);
k01 = index;
end
Fn = (k01+r1-1)*fs/N; %基波頻率
An = 2*pi*r1*Xabs(k01)/(N*sin(r1*pi)); %基波幅值
Pn = phase(X(k01))-pi*r1; %基波相角 單位弧度
Pn = mod(Pn(1),pi);
end