自己實現FFT matlab版本

2021-08-15 13:44:36 字數 2548 閱讀 9455

上課和平時實驗是用的fft都是matlab自帶的,最近需要在乙個嵌入式處理器中對採集的訊號進行fft實時處理,所以想先在matlab中自己寫乙個fft,然後在底層去實現fft演算法。

下面是matlab的**(使用函式進行了封裝):

function [ ret_val ] = fft1024( vector )

%untitled8 此處顯示有關此函式的摘要

%   此處顯示詳細說明

%untitled7 此處顯示有關此函式的摘要

%   此處顯示詳細說明

%***********************************===

%ret_val 為fft變換後返回的頻域序列

%n 為點數

%vector 為變換前的序列

%***********************************===

vector_size = size(vector);

n = vector_size(2);

c = zeros(1,n);

%%變址運算

%j1 = 0;

for i = 1 : n

if i < j1 + 1

tmp = vector(j1 + 1);

vector(j1 + 1) = vector(i);

vector(i) =tmp;

endk = n / 2;

while k <= j1

j1 = j1 - k;

k = k / 2;

endj1 = j1 + k;

end%

%蝶形運算

%%%%%%%%計算 n 的

dig = 0;

k = n;

while k > 1

dig = dig + 1;

k = k / 2;

end%%%%%%

% m 為級; dist 為蝶形運兩點的距離; n 為蝶形運算組數

%n = n / 2;

for m = 1 : dig

dist = 2 ^ (m - 1);

idx = 1;

for i = 1 : n

idx1 = idx;

for j1 = 1 : n / (2 * n)

r = (idx - 1) * 2 ^ (dig - m);

coef = exp(j * (-2 * pi * r / n));

tmp                 = vector(idx);

vector(idx)         = tmp + vector(idx + dist) * coef;

vector(idx + dist)  = tmp - vector(idx + dist) * coef; 

idx = idx + 1;

endidx = idx1 + 2 * dist;

endn = n / 2;

endret_val = vector;

end

測試**:

clc;

clear;

ad_fre = 1023 %修改取樣頻率和取樣點數,取樣時間沒有修改,通過修改改值可以觀察週期擷取對訊號頻譜的影響

adc=2; %直流分量幅度

a1=3; %頻率f1訊號的幅度

a2=1.5; %頻率f2訊號的幅度

f1=50; %訊號1頻率(hz)

f2=75; %訊號2頻率(hz)

fs=ad_fre; %取樣頻率(hz)

p1=0; %訊號1相位(度)

p2=0; %訊號相位(度)

n=ad_fre; %取樣點數

t=[0:1/fs:n/fs]; %取樣時刻

%訊號vector=adc+a1*cos(2*pi*f1*t+pi*p1/180)+a2*cos(2*pi*f2*t+pi*p2/180);

%顯示原始訊號

figure(1)

plot(vector);

title('原始訊號');

y = fft1024(vector); %做fft變換

ayy = (abs(y)); %取模

ayy=ayy/(n/2); %換算成實際的幅度

ayy(1)=ayy(1)/2;

f=([1:n]-1)*fs/n; %換算成實際的頻率值,fn=(n-1)*fs/n

figure(2)

stem(f(1:n/2),ayy(1:n/2)); %顯示換算後的fft模值結果

title('幅度-頻率曲線圖');

% % pyy=[1:n/2];

% for i=1:n/2

% pyy(i)=angle(y(i)); %計算相位

% pyy(i)=pyy(i)*180/pi; %換算為角度

% end;

% subplot(414);stem(f(1:n/2),pyy(1:n/2)); %顯示相位圖

% title('相位-頻率曲線圖');

自己製作Chrome便攜版實現多版本共存

本文只針對windows下的chrome瀏覽器的使用。有時候我們需要使用老版本chrome,或者僅僅體驗一下最新版。上古時代有ietester用來測試多個ie版本,和本機的ie不衝突。chrome別人也製作了很多便攜版,但不知道有沒有加料。利用googlechromeportable.exe啟動器來...

檢視自己的ubuntu 的版本

一 檢視自己的ubuntu 的版本 方法1 在終端中執行下列指令 cat etc issue 可以檢視當前正在執行的 ubuntu 的版本號。其輸出結果類似下面的內容 ubuntu 12.04 lts n l 方法2 使用 lsb release 命令也可以檢視 ubuntu 的版本號,與方法一相比...

自己實現printf

原理不是很難網上有很多,自己搜一下就明白了。void printlog const char fmt,看到上面 太簡單了,也許有人會說,這有什麼用?在我看來最大的用處在於寫日誌,如果我們把 稍稍改下就可以把螢幕上的輸出一起輸出到檔案乙份 在初始化處把全域性變數日誌檔案開啟就像這樣 plogfile ...