FFTW3.3.10庫與QT結合的使用

FFTW(Fastest Fourier Transform in the West)是世界上最快的FFT, 實測計算長度為10000的double數組, 單次運行時間在2ms左右。為了詳細了解FFTW以及為編程方便,特將用戶手冊看了一下,并結合手冊制作了以下FFTW中文參考。其中大部分是原文重點內容的翻譯,并加入了一些注解。

??先看一下使用FFTW編程的方法:

????? #include <fftw3.h>

???? ...

???? {

???????? fftw_complex *in, *out;

???????? fftw_plan p;

???????? ...

???????? in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

???????? out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

????? ???// 輸入數據in賦值

???????? p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

???????? fftw_execute(p); // 執行變換

???????? ...

???????? fftw_destroy_plan(p);

???????? fftw_free(in);

???????? fftw_free(out);

???? }

大致是先用fftw_malloc分配輸入輸出內存,然后輸入數據賦值,然后創建變換方案(fftw_plan),然后執行變換(fftw_execute),最后釋放資源,還是比較簡單的。

一維復數據的DFT

? 1. 數據類型

? ?fftw_complex默認由兩個double組成,在內存中順序排列,實部在 前,虛部在后,即typedef double fftw_complex[2]。FFTW文檔指出如果有一個支持C99標準的C編譯器(如gcc),可以在#include <fftw3.h>前加入#include <complex.h>,這樣一來fftw_complex就被定義為本機復數類型,而且與上述typedef二進制兼容(指內存排列),經 測試不能用在Windows下。C++有一個復數模板類complex<T>,在頭文件<complex>下定義。C++標準委 員會最近同意該類的存儲方式與C99二進制兼容,即順序存儲,實部在前,虛部在后(見報告WG21/N1388),該解決方案在所有主流標準庫實現中都能正確工作。所以實際上可以用complex <double> 來代替fftw_complex,比如有一個復數數組complex<double> *x,則可以將其類型轉換后作為參數傳遞給fftw:reinterpret_cast<fftw_complex*>(x)。測試如下:開 兩個數組fftw_complex x1[2]和complex<double> x2[2],然后賦相同值,在調試模式下可以看到它們的內存排列是相同的。complex<T>類數據賦值的方式不是很直接,必須采用無名對象方式x2[i] = complex <double>(1,2) 或成員函數方式x2[i].real(1);x2[i].imag(2);不能直接寫x2[i].real=1;x2[i].imag=2。 fftw_complex賦值方式比較直接:x1[i][0]=1;x1[i][1]=2。最后,考慮到數據對齊(見后),最好使用 fftw_malloc分配內存,所以可以將其返回的指針轉換為complex <double> *類型使用(比如賦值或讀取等),變換時再將其轉換為fftw_complex*。

? 2. 函數接口

fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, int sign, unsigned flags);

?n為數據個數,可以為任意正整數,但如果為一些小因子的乘積計算起來可以更有效,不過即使n為素數算法仍然能夠達到O(nlogn)的復雜度。FFTW對N=2a 3b 5c 7d 11e 13f的變換處理得最好,其中e+f=0/1,其它冪指數可以為任意值。

? ?如果in和out指針相同為原位運算,否則為非原位運算。

? ?sign可以為正變換FFTW_FORWARD(-1),也可以為逆變換FFTW_BACKWORD(+1),實際上就是變換公式中指數項的符號。需注意FFTW的逆變換沒有除以N,即數據正變換再反變換后是原始數據的N倍。

? ?flags參數一般情況下為FFTW_MEASURE 或 FFTW_ESTIMATE。FFTW_MEASURE表示FFTW會先計算一些FFT并測量所用的時間,以便為大小為n的變換尋找最優的計算方法。依據 機器配置和變換的大小(n),這個過程耗費約數秒(時鐘clock精度)。FFTW_ESTIMATE則相反,它直接構造一個合理的但可能是次最優的方案。總體來說,如果你的程序需要進行大量相同大小的FFT,并且初始化時間不重要,可以使用FFTW_MEASURE,否則應使用 FFTW_ESTIMATE。FFTW_MEASURE模式下in和out數組中的值會被覆蓋,所以該方式應該在用戶初始化輸入數據in之前完成。

? ?不知道上述說法是不是這個意思:先用FFTW_MEASURE模式自動選最優方案,速度較慢;然后使用該模式變換數據就會較快。示例代碼為:

? int length = 50000;

? fftw_complex* din? = (fftw_complex *)fftw_malloc(sizeof(double)*length * 2);

? fftw_complex* dout = (fftw_complex *)fftw_malloc(sizeof(double)*length * 2);

? fftw_plan p?? = fftw_plan_dft_1d(length, din, din, FFTW_FORWARD, FFTW_MEASURE);

? fftw_execute(p);

? // 輸入數據din賦值

? // ...

? fftw_execute(p);

? // 讀取變換結果

? // ...

? fftw_destroy_plan(p);

? fftw_free(din);

? fftw_free(dout);

實驗發現第一個fftw_execute耗費了數秒,而第二個fftw_execute則瞬間完成,說明上述猜想可能是對的。

? ? 創建完方案(fftw_plan)后,就可以用fftw_execute對指定的 數據in/out做任意次變換。如果想變換一個相同大小(N相等)但數據不同的另外一個數組in,可以創建一個新方案,FFTW會自動重用上次方案的信息。這一點其實是非常好的,比如你首先用FFTW_MEASURE模式創建了一個最優的變換方案,只要變換數據的大小不變,你可以用 fftw_plan_dft_1d創建新的方案以對新數據執行變換,同時新變換仍然是最優的。

一個fftw_plan只能對固定的in/out進行變換, 但可以在變換后改變in的內容(大小不變)以用同一個方案執行新的變換

?軟件整體界面如下:

1、可設置正弦信號的頻率、采樣頻率、采樣點數、直流信號、是否加噪聲。

2、點擊“計算FFT”按鈕可生成頻譜。

3、還可以進行自動計算。信號頻譜按10Hz依次增加,再依次計算這個頻率對應的頻譜。運行效果如下:

將原始信號修改為 sin(f0) + sin(f1) + sin(f2) + sin(f3)? 模擬4個不同頻率的信號合成信號。

再看它的FFT變換結果。

源碼出售,完整代碼,包教會表情包?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78811.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器異地備份,服務器異地備份有哪些方法?

服務器異地備份是應對區域性災難&#xff08;如地震、火災、洪水&#xff09;或人為事故&#xff08;如誤刪除、勒索病毒攻擊&#xff09;的關鍵策略&#xff0c;其核心在于將數據副本存儲在物理隔離的地理位置&#xff0c;確保主數據中心故障時仍可恢復業務。 以下是主流的異地…

導軌表面硬化處理有哪些?

導軌是機器工作的重要組成部分&#xff0c;它與滑塊緊密配合&#xff0c;保證機器的運轉精度和定位精度。為了提高導軌的耐磨性能和使用壽命&#xff0c;通常在導軌表面加工硬化層。硬化層一般是在導軌表面形成一層高硬度和高強度的薄層&#xff0c;有效地提高了導軌的耐磨性能…

Android Compose vs 傳統View系統:全面對比與選型指南

Android Compose vs 傳統View系統&#xff1a;全面對比與選型指南 一、引言 隨著Android Jetpack Compose的正式發布&#xff0c;Android開發迎來了全新的聲明式UI框架。本文將全面對比Compose與傳統View系統的差異&#xff0c;幫助開發者做出合理的技術選型。 二、核心架構…

C#中實現JSON解析器

JSON(JavaScript Object Notation)即 JavaScript 對象表示法,是一種輕量級的數據交換格式。 起源與發展 JSON 源于 JavaScript 編程語言,是 JavaScript 對象字面量語法的一個子集。但如今它已經獨立于 JavaScript,成為一種通用的數據格式,廣泛應用于各種編程語言和系統…

【Maven】子POM與父POM

文章目錄 子POM與父POM一、繼承的內容1.子 POM 可以繼承父 POM 的內容2.子 POM 中聲明相同配置覆蓋規則示例 子POM與父POM 一、繼承的內容 在 Maven 項目結構中&#xff0c;子 POM&#xff08;子模塊&#xff09;可以繼承父 POM 的很多配置。合理使用繼承機制可以大大減少重復…

12前端項目----添加購物車1.0

商品添加購物車 商品數量添加購物車瀏覽器本地存儲localStoragesessionStorage添加成功頁面 商品數量 輸入為數字&#xff0c;最少為1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…

EasyRTC嵌入式音視頻通信SDK助力視頻客服,開啟智能服務新時代

一、背景 在數字化服務浪潮下&#xff0c;客戶對服務體驗的要求日益提升&#xff0c;傳統語音及文字客服在復雜業務溝通、可視化指導等場景下漸顯不足。視頻客服雖成為企業服務升級的關鍵方向&#xff0c;但普遍面臨音視頻延遲高、畫質模糊、多端適配難、功能擴展性差等問題&a…

干貨分享|MaxKB智能問數方案及步驟詳解

DeepSeek-R1的發布掀起了AI智能變革的浪潮。在過去幾個月里&#xff0c;MaxKB開源企業級AI助手已經幫助大量企業和組織快速落地了DeepSeek&#xff0c;讓AI在不同的行業土壤中產生持續、可度量的業務價值。 MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09; 可以為本…

【python】數據類型小結

1.數據類型 int、float、str、bool、元組tuple、列表list、字典dict、集合set 分為兩類&#xff1a;可變和不可變數據類型 2.可變數據類型和不可變數據類型 當變量的值變化&#xff0c;內存地址不變則為可變數據類型&#xff0c; eg&#xff1a;int、float、bool、字符串st…

泰山派常用命令

0.連接adb 設備列表&#xff1a;adb devices 進入命令&#xff1a;adb shell 1.連接WiFi 查看當前網絡&#xff1a;nmcli con show 我的WiFi名稱&#xff1a;6 我的WiFi密碼&#xff1a;12345789 連接當前網絡&#xff1a;nmcli device wifi connect 6 password 1234578…

whois為什么有時會返回兩個不同的域名狀態

前陣子發現一直想注冊但被別人注冊了的一個域名快要過期了&#xff0c;就想著寫個腳本跑在電腦上&#xff0c;每分鐘檢查一次域名狀態&#xff0c;一旦域名被正式刪除&#xff0c;就發封郵件通知我&#xff0c;這樣就不用頻繁手動檢查域名狀態了。 寫腳本時發現一個有趣的現象…

NGINX ngx_http_addition_module 模塊響應體前后注入內容

一、模塊概述 模塊名稱&#xff1a;ngx_http_addition_module引入版本&#xff1a;自 0.7.9 起支持 addition_types&#xff0c;0.8.29 起支持“*”通配&#xff1b;功能&#xff1a;對符合 MIME 類型的響應&#xff0c;在響應體前后分別插入指定子請求 URI 返回的內容&#x…

半監督學習與強化學習的結合:新興的智能訓練模式

&#x1f4cc; 友情提示&#xff1a; 本文內容由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;創作平臺的gpt-4o-mini模型生成&#xff0c;旨在提供技術參考與靈感啟發。文中觀點或代碼示例需結合實際情況驗證&#xff0c;建議讀者通過官方文檔或實踐進一步確認其準…

復習Vue136~180

1.使用create-vue創建項目 npm init vuelatest 項目目錄和關鍵文件&#xff1a; new Vue() 創建一個應用實例 > createApp()、createRouter() createStore() 、將創建實例進行了封裝&#xff0c;保證每個實例的獨立封閉性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…

QT采用mqtt進行通信(17.1)

文章目錄 1.試錯歷程2. qt5.8安裝3. 開始搞了4. 測試連接mqtt broker1.試錯歷程 嘗試過網上說的各種版本,官方庫和第三方庫,試過qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各個版本,都能編譯通過,調用mqtt庫,但是都不能連接成功,真的是試吐了,不知道他們的為什么都能成功,…

西門子PLC結構化編程_水處理系統水泵多備多投

文章目錄 前言一、功能概述二、程序編寫1. 需求分析2. 編寫運行時間累計功能塊3. 創建自定義數據類型1. 時間排序數據類型2. 多備多投數據類型3. 多備多投切換數據類型 4. 編程1. 創建DB數據塊1. 多備多投數據塊2. 多備多投切換數據塊 2. 創建FB功能塊 三、程序調用總結 前言 …

QT:自定義ComboBox

實現效果: 實現combobox的下拉框區域與item區域分開做UI交互顯示。 支持4種實現效果,如下 效果一: 效果二: 效果三: 效果四: 實現邏輯: ui由一個toolbutton和combobox上下組合成,重點在于combobox。 我設置了4種枚舉,ButtonWithComboBox對應效果一;OnlyButt…

VS2022+OpenCasCade配置編譯

一、Open CASCADE Technology介紹及安裝&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;簡稱OCCT&#xff09;是一款開源的 3D CAD/CAM/CAE 軟件開發平臺&#xff0c;廣泛應用于工業設計、工程仿真、制造等領域。開源OCC對象庫是一個面向對象C類庫&…

【OSG學習筆記】Day 12: 回調機制——動態更新場景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用來動態更新場景的關鍵機制。 借助UpdateCallback&#xff0c;你能夠實現節點的動畫效果&#xff0c;像旋轉、位移等。 NodeCallback osg::NodeCallback 是一個更通用的回調類&…

全新升級:BRAV-7601-T003高性能無風扇AI邊緣計算系統,助力智能未來!

在數字化與智能化飛速發展的今天&#xff0c;AI邊緣計算正成為各行各業的核心驅動力。BRAV-7601作為一款高性能無風扇AI邊緣計算系統&#xff0c;憑借其強大的硬件配置與豐富的擴展能力&#xff0c;為車路協同、特種車輛車載、機器視覺、醫療影像等領域提供了卓越的解決方案。最…