基于FPGA頻率、幅度、相位可調的任意函數發生器(DDS)實現

基于FPGA實現頻率、幅度、相位可調的DDS

1 摘要

直接數字合成器( DDS ) 是一種通過生成數字形式的時變信號并進行數模轉換來產生模擬波形(通常為正弦波)的方法,它通過數字方式直接合成信號,而不是通過模擬信號生成技術。DDS主要被應用于信號生成、通信系統中的本振、函數發生器、混頻器、調制器、聲音合成器以及作為數字鎖相環的一部分。

2 DDS技術優點

(1)頻率分辨率較高,一般在0.01Hz左右,有的能做到1uHz,甚至更小;
(2)轉換時間快,系統無反饋環節,其開環結構使得頻率轉換時間很短,最快可以達到納秒級;
(3)具有輸出任意波形的能力,只要將任意波形數據加載到ROM中,通過DAC輸出,即可得到ROM存儲的任意波形;
(4)具有調制能力,DDS是相位控制系統,有利于各種調制功能。DDS技術的這些優點,使它成為衛星定位、移動通信、數字通信等系統中信號源的首選。

3 功能原理

3.1 模型結構

DDS 是從相位出發,直接采用數字技術產生波形的一種頻率合成技術。基本模型如圖所示,主要由時鐘頻率源、相位累加器、波形存儲器、及后級數模轉換器(DAC)、低通濾波器(LPF)組成。頻率控制字M和相位控制字分別控制DDS輸出正(余)弦波的頻率和相位。每來一個時鐘脈沖,相位寄存器以步長M遞增。相位寄存器的輸出與相位控制字相加,其結果作為正(余)弦查找表的地址。正(余)弦查找表的數據存放在ROM中,內部存有一個周期的正弦波信號的數字幅度信息,每個查找表的地址對應于正弦波中 0°~360°范圍內的一個相位點。查找表把輸入的址信息映射成正(余)弦波的數字幅度信號,同時輸出到數模轉換器DAC的輸入端,DAC 輸出的模擬信號經過低通濾波器 (LPF),可得到一個頻譜純凈的正(余)弦波。
在這里插入圖片描述(1)累加器:通過頻率控制字和相位控制字的累加,來取出波形數據表中相對應位置的數據。
(2)波形數據表:存儲波形數據(我們主要采取matllab工具生成波形數據)
(3)數模轉換器:將離散數據變成連續的。
(4)低通濾波器:對數模轉換器出來的波形進行濾波,達到一個平滑波形的作用。在這里插入圖片描述

3.2 DDS原理

1、工作原理頻率字B,數值大小控制輸出信號的頻率大小,數值越大輸出信號頻率越高,反之越小。
假設ROM的深度的位寬為N,所以ROM一共有 2N 個數據。讀取ROM的時鐘為fclk ,如果一個時鐘周期讀地址+1,那么讀出一個完整的波形需要的時間為:

在這里插入圖片描述
則讀出的波形頻率fout
在這里插入圖片描述
如果每一個時鐘周期讀地址+B,那么讀出一個完整的波形需要的時間為
在這里插入圖片描述
頻率控制字B,由上述式計算得
在這里插入圖片描述

2、工作原理相位字P,數值大小控制輸出信號的相位偏移,主要用于相位的信號調制。
我們用一個矢量圖來描述相位,已知我們整個波形的采樣點是2N個,當改變讀rom的起始地址,就能改變讀出來的波形相位,假設每次相位變換為1°,則相位控制字p_word

在這里插入圖片描述
根據矢量圖計算相位分辨率
在這里插入圖片描述
當需要對信號改變N°時,則計算出相應的相位字P為
在這里插入圖片描述

3、波形數據表 ROM波形數據表 ROM 以相位調制器傳入的相位碼為 ROM 讀地址,將地址對應存儲單元中的電壓幅值數字量輸出。
4、波形DAC輸出自波形數據表 ROM 輸出的波形數據傳入 D/A 轉換器轉換為模擬信號。D/A 轉換器即數/模轉換器指將數字信號轉換為模擬信號的電子元件或電路。

4 DDS的現實

4.1 ROM波形數據生成

使用MATLAB來生成正弦波、方波、三角波、鋸齒波的波形,通過FPGA ROM IP核加載COE文件存儲相應的波形數據,MATLAB代碼

%*****************************************square_wave *******************************%
%參數設置
% bitWidth = 14;   % 位寬
% depth = 2048;    % 深度
% maxValue = 2^bitWidth - 1; % 無符號數的最大值
% 
% % 生成方波
% t = linspace(0, 1, depth);
% halfCycle = depth / 2; % 半個周期的樣本數
% squareWave = zeros(1, depth); % 初始化方波數組
% 
% % 生成方波
% for i = 1:depth
%     if i <= halfCycle
%         squareWave(i) = maxValue; % 高電平
%     else
%         squareWave(i) = 0; % 低電平
%     end
% end
% 
% % 將方波限制在無符號范圍內
% squareWave = uint16(squareWave);
% plot(squareWave)
% % 打開文件以寫入
% fileID = fopen('square_wave.coe', 'w');
% 
% % 寫入COE文件頭
% fprintf(fileID, 'memory_initialization_radix=10;\n');
% fprintf(fileID, 'memory_initialization_vector=\n');
% 
% % 寫入數據
% for i = 1:depth
%     fprintf(fileID, '%d', squareWave(i));
%     if i < depth
%         fprintf(fileID, ',\n');
%     else
%         fprintf(fileID, ';\n');
%     end
% end
% 
% % 關閉文件
% fclose(fileID);
% 
% disp('COE文件生成成功!');%*****************************************sin_wave *******************************%
% % 參數設置
% bitWidth = 14;   % 位寬
% depth = 2048;    % 深度
% maxValue = 2^bitWidth - 1; % 無符號數的最大值
% offset = maxValue / 2; % 為了將正弦波移動到無符號范圍內
% 
% % 生成正弦波
% t = linspace(0, 2 * pi, depth); % 生成一個周期
% sineWave = offset + round((maxValue / 2) * sin

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

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

相關文章

本地JAR批量傳私服

在有網絡隔離的環境下&#xff0c;Maven項目如果沒有搭建私服就得把用到的通用組件通過U盤在每個組員間拷貝來拷貝去。非常的麻煩跟低效。搭建私服&#xff0c;如果通用組件很多的時候手工一個一個上傳更是非常的麻煩跟低效&#xff1b; 我就遇上這問題&#xff0c;跟A公司合作…

【ROS實戰】02-ROS架構介紹

1. 簡介 你是否曾有過這樣的疑問&#xff1a;我按照文檔安裝了ROS&#xff0c;依照要求寫了一些示例節點&#xff08;node&#xff09;、消息&#xff08;msg&#xff09;和話題&#xff08;topic&#xff09;&#xff0c;但覺得過程既麻煩又繁瑣。也許你開始懷疑&#xff1a;…

LeetCode算法題(Go語言實現)_07

題目 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法&#xff0c;且在 O(n) 時間復…

網絡華為HCIA+HCIP 網絡編程自動化

telnetlib介紹 telnetlib是Python標準庫中的模塊。它提供了實現Telnet功能的類telnetlib.Telnet。這里通過調用telnetlib.Telnet類里的不同方法實現不同功能。 配置云

查看GPU型號、大小;CPU型號、個數、核數、內存

GPU型號、大小 nvidia-smiCPU型號 cat /proc/cpuinfo | grep model name | uniqCPU個數 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核數 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU內存 cat /proc/meminfo | grep MemTotal參考…

Docker與K8S是什么該怎么選?

用了很久的容器化&#xff0c;最近突然看到一個問題問&#xff1a; docker和K8S究竟有什么區別&#xff0c;到底該怎么選&#xff1f;我認真思考了一會&#xff0c;發現一時間還真說不明白&#xff0c;于是就研究了一段時間發布今天的博文&#xff01; Docker vs Kubernetes&a…

Android Handler 通過線程安全的 MessageQueue 和底層喚醒機制實現跨線程通信

目錄 一、MessageQueue 的線程安全實現 1. 消息隊列的同步鎖&#xff08;synchronized&#xff09; 2. 消息順序與延時處理 二、底層喚醒機制&#xff1a;從 Java 到 Linux 內核 1. 消息插入后的喚醒邏輯 2. Native 層實現&#xff08;基于 Linux 的 eventfd 和 epoll&am…

關于 2>/dev/null 的作用以及機理

每個進程都有三個標準文件描述符&#xff1a;stdin&#xff08;標準輸入&#xff09;、stdout&#xff08;標準輸出&#xff09;和stderr&#xff08;標準錯誤&#xff09;。默認情況下&#xff0c;stderr會輸出到終端。使用2>可以將stderr重定向到其他地方&#xff0c;比如…

MySQL中的鎖機制:從全局鎖到行級鎖

目錄 1. 鎖的基本概念 2. 全局鎖 2.1 全局鎖的定義 2.2 全局鎖的類型 2.3 全局鎖的使用場景 2.4 全局鎖的實現方式 2.5 全局鎖的優缺點 2.6 全局鎖的優化 3. 表級鎖 3.1 表級鎖的類型 3.2 表級鎖的使用場景 3.3 表級鎖的優缺點 4. 意向鎖&#xff08;Intention Lo…

編程語言選擇分析:C#、Rust、Go 與 TypeScript 編譯器優化

編程語言選擇分析&#xff1a;C#、Rust、Go 與 TypeScript 編譯器優化 在討論編程語言的選擇時&#xff0c;特別是針對微軟的 C# 和 Rust&#xff0c;以及谷歌的 Go 語言&#xff0c;以及微軟試圖通過 Go 來拯救 TypeScript 編譯器的問題&#xff0c;我們可以從多個角度來分析和…

基于WebRTC的嵌入式音視頻通話SDK:EasyRTC跨平臺兼容性技術架構實時通信的底層實現

EasyRTC的核心架構圍繞WebRTC技術構建&#xff0c;同時通過擴展信令服務、媒體服務器和NAT穿透機制&#xff0c;解決了WebRTC在實際部署中的痛點。其架構可以分為以下幾個核心模塊&#xff1a; 1&#xff09;WebRTC基礎層 媒體捕獲與處理&#xff1a;通過getUserMediaAPI獲取…

【Rust】包和模塊管理,以及作用域等問題——Rust語言基礎15

文章目錄 1. 前言2. 包和 Crate3. 定義模塊以及模塊之間的關系4. 作用域問題4.1. 作用域問題初現4.2. 解決問題一4.3. 解決問題二4.4. super 關鍵字4.5. 將路徑引入作用域4.6. as 關鍵字4.7. pub use 重導出 5. 引入的問題5.1. 引入一個外部包5.2. 嵌套路徑來消除大量的 use 行…

微服務架構中的API網關:Spring Cloud與Kong/Traefik等方案對比

微服務架構中的API網關&#xff1a;Spring Cloud與Kong/Traefik等方案對比 一、API 網關的概念二、API 網關的主要功能2.1 統一入口與路由轉發2.2 安全與權限控制2.3 流量管理與容錯2.4 API 管理與聚合2.5 監控與日志2.5 協議轉換與適配2.6 控制平面與配置管理 三、API 網關選型…

NewStar CTF web wp

文章目錄 week1headach3會贏嗎智械危機謝謝皮蛋PangBai 過家家&#xff08;1&#xff09; week3include meblindsql1臭皮的計算機臭皮踩踩背這照片是你嗎 week4Pangbai過家家四blindsql2chocolateezcmsssezpollute隱藏的密碼 weeek5pangbai過家家(5)redissqlshell臭皮吹泡泡臭皮…

Linux驅動開發-①中斷②阻塞、非阻塞IO和異步通知

Linux驅動開發-①中斷②阻塞、非阻塞IO和異步通知 一&#xff0c;中斷1.中斷的流程2.上半部和下半部2.1上半部2.2下半部2.2.1 tasklet2.2.2 工作隊列 3.按鍵延時消抖中斷程序 二&#xff0c;阻塞和非阻塞IO和異步通知1.阻塞IO1.1 常見結構11.2 常見結構2 2.非阻塞IO2.1 驅動結構…

Docker和Dify學習筆記

文章目錄 1 docker學習1.1 基本命令使用1.1.1 docker ps查看當前正在運行的鏡像1.1.2 docker stop停止容器1.1.3 docker compose容器編排1.1.4 docker網絡[1] 進入到容器里面敲命令[2] docker network ls[3] brige網絡模式下容器訪問宿主機的方式 2 Dify的安裝和基礎使用2.1 下…

高并發庫存系統是否適合使用 ORM(Hibernate / MyBatis)

在設計高并發的庫存管理系統時&#xff0c;數據層的選擇至關重要。許多企業開發中習慣使用 ORM&#xff08;如 Hibernate、MyBatis&#xff09;來簡化數據庫訪問&#xff0c;但在高并發、高吞吐的場景下&#xff0c;ORM 的適用性往往成為爭議焦點。本文將探討高并發庫存系統是否…

Web爬蟲利器FireCrawl:全方位助力AI訓練與高效數據抓取。本地部署方式

開源地址&#xff1a;https://github.com/mendableai/firecrawl 01、FireCrawl 項目簡介 Firecrawl 是一款開源、優秀、尖端的 AI 爬蟲工具&#xff0c;專門從事 Web 數據提取&#xff0c;并將其轉換為 Markdown 格式或者其他結構化數據。 Firecrawl 還特別上線了一個新的功…

探秘Transformer系列之(16)--- 資源占用

探秘Transformer系列之&#xff08;16&#xff09;— 資源占用 文章目錄 探秘Transformer系列之&#xff08;16&#xff09;--- 資源占用0x00 概述0x01 背景知識1.1 數據類型1.2 進制&換算數字進制存儲度量換算 1.3 參數顯存占用有參數的層無參數的層所需資源 1.4 計算量 0…

jaeger安裝和簡單使用

文章目錄 jaeger安裝和使用什么是jaegerjaeger安裝 jaeger安裝和使用 什么是jaeger 官網&#xff1a;https://www.jaegertracing.io/ Jaeger 是一個分布式追蹤系統。Jaeger的靈感來自 Dapper 和 OpenZipkin&#xff0c;是一個由 Uber 創建并捐贈給 云原生計算基金會&#xf…