IOS 快速傅利葉變換 使用系統框架vDSP

2021-07-27 09:13:55 字數 2919 閱讀 8952

簡介:

vdsp的api提供了一維訊號與二維訊號,在時域與頻域中的傅利葉變換。(這裡只翻譯一維訊號)

fft權重陣列:

為了更好的精度,vdsp處理頻域的函式需要乙個已經存在的,複雜的指數陣列來呼叫。一旦建立一次,那麼所有的fft變換就可以共享這個陣列。這個權重陣列可以使用vdsp_create_fftsetup

(single-precision) 或者

vdsp_create_fftsetupd

(double-precision)來建立。在呼叫變換函式之前必須至少呼叫一次這個函式。開始要先確定變換點數,來建立函式:

(1)為陣列建立乙個資料塊。

(2)建立陣列(寫資料)。

(3)儲存得到的指標。

一定要確保這個指標不為空。

引數 log2n 是以2為低 n的對數。這裡的n是最大要傅利葉變換的點數。 比如進行1024點的快速傅利葉變換 ,那就寫10。

fftsetup setup=vdsp_create_fftsetup( 11, 0 ); /* supports up to 2048 (2**11)

points */

用完後釋放,釋放函式:

vdsp_destroy_fftsetup(setup);

快速傅利葉變換**:

vdsp_fft_zrip( setup, small_set, 1, 8, fft_forward); /* 256 (2**8) points  */

逆變換就是把 

fft_forward 改為 

fft_inverse

然後乙個用的比較多的dsp函式 順序相乘函式:

void vdsp_vmul(

float *input_1, /* input vector 1 */

sint32 stride_1, /* address stride for input vector 1 */

float *input_2, /* input vector 2 */

sint32 stride_2, /* address stride for input vector 2 */

float *result, /* output vector */

sint32 strideresult, /* address stride for output vector */

uint32 size /* real output count */

); 

/* multiply sequential values of two 1,024-point vectors */

float a[1024], b[1024], c[1024];

vdsp_vmul( a, 1, b, 1, c, 1, 1024 );//結果就是 c[i]=a[i]*b[i],i=0~1024; 3個1的引數,大概也能猜出來,是跳位的,測試一下就明白了

最後加上我翻譯後封裝的 快速傅利葉變換 函式,需要自己開闢 complex_split 空間再呼叫

complex_split jubufferdata;

jubufferdata.realp=(float32 *)malloc(nfft*sizeof(float32));

jubufferdata.imagp=(float32 *)malloc(nfft*sizeof(float32));

#import

#import

@inte***ce fftwmanager : nsobject

-(id)initwithmaxp:(int) maxp; // maxp:傅利葉變換最大點數

-(void)fftmrelease;

-(void)fft:(complex_split *)inoutdata lengnth:(long) numofp; //快速傅利葉變換(結構體指標)

-(void)ifft:(complex_split *)inoutdata lengnth:(long) numofp; //快速傅利葉逆變換(結構體指標)

-(void)xiangcheng:(float32 *)indataa b:(float32 *)indatab out:(float32 *)outdata lenght:(long)numofp;

//-(complex *)fftc:(complex *)inputdata lengnth:(long) numofp; //快速傅利葉變換(結構體陣列) 慢一點

//-(complex *)ifftc:(complex *)inputdata lengnth:(long) numofp; //快速傅利葉逆變換(結構體陣列) 慢一點

@end

#import "fftwmanager.h"

#include

@implementation fftwmanager

-(id)initwithmaxp:(int) maxp

return self;

}-(void)fftmrelease

-(void)fft:(complex_split *)inoutdata lengnth:(long) numofp

-(void)ifft:(complex_split *)inoutdata lengnth:(long) numofp

-(void)xiangcheng:(float32 *)indataa b:(float32 *)indatab out:(float32 *)outdata lenght:(long)numofp

//-(complex *)fftc:(complex *)inputdata lengnth:(long) numofp

////-(complex *)ifftc:(complex *)inputdata lengnth:(long) numofp

//@end

IOS 快速傅利葉變換 使用系統框架vDSP

簡介 vdsp的api提供了一維訊號與二維訊號,在時域與頻域中的傅利葉變換。這裡只翻譯一維訊號 fft權重陣列 為了更好的精度,vdsp處理頻域的函式需要乙個已經存在的,複雜的指數陣列來呼叫。一旦建立一次,那麼所有的fft變換就可以共享這個陣列。這個權重陣列可以使用vdsp create fftse...

傅利葉變換與快速傅利葉變換

作為電子資訊專業的學生老說,這個不知道,或者理解不清楚,是十分不應該的,作為乙個學渣,有時候確實是理解不清楚的 1 首先離散傅利葉變換目的 簡單點說 就是將乙個訊號從時域變換到頻域 標準點說 將以時間為自變數的訊號 與 頻率為自變數的頻譜函式之間的某種關係變換 數學描述 對於 n點序列 其中自然對數...

快速傅利葉變換

學習快速傅利葉變化是量子計算中的基礎,查了很多資料,以下鏈結可以作為參考 本部落格部分知識學習於 最後這個裡面有解釋蝴蝶效應是怎麼來的!實用數字訊號處理 dft 離散傅利葉變換 o n2 計算多項式乘法 fft 快速傅利葉變換 o n log n 計算多項式乘法 fntt ntt 快速傅利葉變換的優...