當前位置:首頁 » 編程語言 » 基於dsp濾波器c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

基於dsp濾波器c語言

發布時間: 2022-12-20 09:28:03

① 如何用c語言來實現數字濾波器

用C語言實現,希望能給出個完整的已調試好程序,不甚感謝,給你20分問題補充:例子中9、2、14有誤,應該是11、2、14
太麻煩了
我只編了一

② 求IIR及FIR數字濾波器的C語言實現。(VC++)

這個問題比較復雜,最近本人也在研究數字濾波,

結合圖片說一下

第一個圖是fir的流程圖,其中Z-1是延遲,是單個采樣時間1/fs

n階的fir濾波器就是選取最近的n+1個樣本,然後使他們各自乘以自己的濾波器系數即圖中的F(n),[一般其他書的表示是h(n)]

然後相加得到輸出的y(n)就是一個輸出點

,其中F(n)的得出需要根據采樣頻率和濾波器的通帶和阻帶來決定

其中為了改善旁瓣的幅值,一般在采樣後給樣本或者h(n)加窗,當然可以用「最佳方法」來做

得出h(n)大致方法是先將矩形窗進行DFT,得出h(n),然後對h(n)進行加窗得出h(k),然後將∑h(k)×x(n)=y(n),假如階數較多可以用傅里葉變換使時域變頻域後再將卷積相加,可以利用FFT來改進實時性,提升速度

上面就是fir濾波器的簡述

第二個圖片上傳不了,直接給鏈接

http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7&in=12708&cl=2&cm=1&sc=0&lm=-1&pn=0&rn=1&di=2607528304&ln=1054&fr=

圖中的Z-1是延時,iir濾波器也叫無限沖擊響應濾波器,是有反饋的,

圖中的是一階的,相對fir濾波器來說,iir濾波器可以用較低的階數來獲得較好的濾波特效。但是其相位特性較差。

鑒於實用性,還是建議樓主去圖書館借書看,網路不可能得到確實的方案,

樓主可以去借「數字信號處理」的書,國外的中譯本就有詳細介紹fir和iir以及fft還有其他變換,國內的dsp大都幾乎是dsp用戶手冊的中譯本,對上述問題都是很簡陋地帶過,不予置評。

本人推薦一本書在www.ouravr.com上面的dsp專欄有下載,40多M,叫DSP演算法、應用和設計,本人有這本實體書,寫的較好

③ 懂DSP的來看看吧。由於時間問題,現求助幫忙開發一個基於TMS320VC5509的卡爾曼濾波器程序。詳見補充、

我相信你可以自己完成,不是么?

④ 如何利用C語言編寫二階高通濾波器,跪求高手幫助

數字濾波器而已~~搞清原理就簡單啦~~~定義個數組,或者把濾波器參數也定義在數組里方便修改,來一個新數據移位一下就行了

⑤ DSP用什麼語言 有沒有什麼書

那要看你用什麼片子了,還有老師有什麼要求或者工作中有什麼要求,一般來說是匯編語言和c語言。我現在在用2407的片子做一個fir濾波器,基本上是用c語言。

匯編雖然比較簡單和直觀,但是在編程的過程中匯編語言的程序比較長。

相對而言c語言要有一定的基礎,編程的時候比較繁瑣但是要有一定基礎程序可以簡單,可以嵌套許多函數什麼的,程序分塊化處理對於編程的人員就比較輕鬆了。

不知道你是剛剛學習還是有了一定的基礎(c語言基礎),如果想要好好學習的話還是弄本書看看,要簡單一點的,弄清楚片子的基本結構和中斷的使用,還有就是要實踐,多多實踐,我在看一本書是專門講2407片子的使用的,叫做《TMS320X240XDSP原理及應用開發指南》是北京航天航空大學出版社出版的,作者是:趙世廉

還有就是你要用什麼樣的的片子做東西。TI公司(德州電氣公司【美國的公司,世界上也是很著名的公司】)生產的片子有三個系列,他們分別是:C2000,C5000和C6000,性能也是從低到高的,還有什麼問題的話還是多多問問老師,和多看看書。。一般而言,2812的片子要好一點,當然看你是不是要處理高頻信號,如果是高頻信號的話就要跟高級的晶元了,因為處理的速度是高級晶元快但是價格也比較高。做的時候還要考慮成本的問題。

不知道我的答案有沒有什麼不妥之處。希望我的回答對你有幫助。

⑥ 如何用C語言實現低通濾波器

floatmiddle_filter(floatmiddle_value[],intcount)
{
floatsample_value,data;
inti,j;
for(i=1;ifor(j=count-1;j>=i,--j){
if(middle_value[j-1]=middle_value[j]{
data=middle_value[j-1];
middle_value[j-1]=middle_value[j]
middle_value[j]=data;
}
}
sample_value=middle_value(count-1)/2];
return(sample_value);
}

⑦ 巴特沃斯濾波器c語言實現

說的很對,濾波玩的就是增益(衰減)變化,不同的頻率,不同的增益(衰減)。稱幅頻曲線。
1、巴特奧斯濾波器的截止頻率指-3db通頻帶頻率,也就是在這個頻率以內保證暢通(通帶)。
2、另一個指標叫做阻帶,頻率大於此值能夠保證衰減大於某值

⑧ dsp:FIR濾波器的設計

題目:利用DSP的FIR濾波器設計

數字處理器(DSP)有很強的數據處理能力,它在高速數字信號處理領域有廣泛的應用,例如數字濾波、音頻處理、圖像處理等。相對於模擬濾波器,數字濾波器沒有漂移,能夠處理低頻信號,頻率響應特性可做成非常接近於理想的特性,且精度可以達到很高,容易集成等。使用可編程的DSP晶元實現數字濾波可以通過修改濾波器的參數十分方便地改變濾波器的特性,下面主要說明利用TMS320VC54x DSP晶元設計實現FIR數字濾波器。
設計目的意義
一個實際的應用系統中,總存在各種干擾,所以在系統設計中,濾波器的好壞將直接影響系統的性能。使用DSP進行數字處理,可以對一個具有雜訊和信號的混合信號源進行采樣,再經過數字濾波,濾除雜訊,就可以提取有用信號了。所以說,數字濾波器是DSP最基本的應用領域,熟悉基於DSP的數字濾波器能為DSP應用系統開發提供良好的基礎。
技術指標
1、數字濾波器的頻率參數主要有:①通帶截頻:為通帶與過渡帶的邊界點,在該點信號增益下降到規定的下限。②阻帶截頻:為阻帶與過渡帶的邊界點,在該點信號衰耗下降到規定的下限。③轉折頻率:為信號功率衰減到1/2(約3dB)時的頻率,在很多情況下,也常以fc作為通帶或阻帶截頻。④當電路沒有損耗時,固有頻率:就是其諧振頻率,復雜電路往往有多個固有頻率。
2、增益與衰耗
濾波器在通帶內的增益並非常數。①對低通濾波器通帶增益,一般指ω=0時的增益;高通指ω→∞時的增益;帶通則指中心頻率處的增益。②對帶阻濾波器,應給出阻帶衰耗,衰耗定義為增益的倒數。③通帶增益變化量指通帶內各點增益的最大變化量,如果通帶增益變化量以dB為單位,則指增益dB值的變化量。
3、阻尼系數與品質因數
阻尼系數α是表徵濾波器對角頻率為ω0信號的阻尼作用,是濾波器中表示能量衰耗的一項指標,它是與傳遞函數的極點實部大小相關的一項系數。
4、靈敏度
濾波電路由許多元件構成,每個元件參數值的變化都會影響濾波器的性能。
5、群時延函數
在濾波器設計中,常用群時延函數評價信號經濾波後相位失真程度。
以上的幾個技術指標是一般濾波器的特性,但在實際應用中,數字濾波器通常用來實現選頻操作,因此在利用DSP實現數字濾波器設計中要求的技術指標主要為在頻域中給出的幅頻響應和相頻響應。如下圖所示

幅頻響應和相頻響應特性曲線
對於幅頻響應,它的含義是信號通過系統之後的輸出信號的幅度與它輸入時的信號的幅度的比值,一般以分貝值表示。對於相頻響應,含義是信號通過系統之後的輸出信號的相位與它輸入時的信號的相位之差,在運用線性相頻響應指標進行濾波器設計具有如下優點:①只包含實數演算法,不涉及復數運算;②不存在延遲失真,只有固定數量的延遲;③可以採用FFT演算法,從而提高運行效率;④由於FIR濾波器的單位脈沖響應是有限長序列,故FIR濾波器沒有不穩定的問題,且誤差較小。
基本原理
利用DSP實現FIR濾波器的設計方法主要有窗函數法和頻率抽樣法,其中窗函數法是基本的設計方法,這里採用窗函數法設計FIR濾波器。設希望得到的濾波器理想響應為 ,那麼FIR濾波器的設計就在於尋找一個傳遞函數

去逼進 ,設

這里 就是傅立葉級數的系數。在這種逼近中,最直接的一種方法就是從單位脈沖響應 入手,使 逼近理想的單位脈沖響應 。由於 是一個無限長序列,因此,最簡單的方法就是對 做截尾處理,即得到一個近似的傳遞函數

上式中,Q就是最終確定FIR濾波器的階數,Q越大,近似程度就越高。對 截尾,實際上就是對 乘上一個矩形窗口 ,即

令z= ,則

其脈沖響應系數為 , ,…, , , ,…, , 。為使 具有因果性,延時Q個樣值,可得:

令n+Q=k,上式成為

令 ,N=2Q,得

式中, 是脈沖響應系數,這里 …, ,…, 。
一般來說,FIR數字濾波器輸出 的Z變換形式 與輸入 的Z變換形式之間的關系如下:

實現結構如下圖所示:

Z變換結構圖
從上面的Z變換和結構圖可以很容易得出FIR濾波器的差分方程表示形式,即對上式進行反Z變換得:

上式為FIR數字濾波器的時域表示方法,其中x(n)是在時間n的濾波器的輸入抽樣值,根據上式即可對濾波器進行設計。
硬體設計
1、DSP晶元
根據設計原理,實現的核心器件採用美國德州儀器公司生產的低功耗定點數字信號處理器晶元TMS320C5402。選擇該晶元主要是因為它是目前最常用的低成本DSP晶元,而且包括以下主要特點:
⑴運算速度快,最快可達532MIPS;
⑵多匯流排結構,片內共有8 條匯流排(1條程序存儲器匯流排、3條數據存儲匯流排和4條地址匯流排);
⑶CPU採用馮? 諾依曼並行結構設計,使其能在一條指令周期內,高速地完成多項算術運算;
⑷片內集成了4K×16bitROM和16K×16bit的雙存取RAM;
⑸豐富的片上外圍電路(通用I/O 引腳,定時器,時鍾發生器, HPI 介面,多通道緩沖串列口McBSP)使其與外部介面方便;
⑹3.3V I/O電壓,1.8V核點壓,工作電流平均值為75mA,其中核45mA,I/O約30mA;
⑺144腳BGA封裝,使體積減少,功耗降低。
2、AD和DA電路
在本數字濾波器系統中選擇了TI公司的TLV1570晶元作為模數轉換器件,8通道10位2.7到5.5 V低電壓模數轉換晶元。TLVl570在3V電壓下的采樣頻率為625KSPS,輸入信號最高頻率不能超過300K。
由於模數轉換選擇了10位器件,為了簡化程序代碼,減少DSP 的運算工作量,在本數字濾波器系統中選擇了TI公司的TLV5608晶元,它是一款8通道10位2.7到5.5V低電壓數模轉換晶元。
3、電源電路
根據DSP晶元工作的電壓電流需求,及晶元採用雙電源供電對加電順序的要求,考慮使用TI公司的電源轉換晶元TPS73HD318,其輸出電壓為一路3.3V、一路1.8V,每路電源的最大輸出電流為750mA,能滿足本系統的供電需求。而且TPS73xx具有非常低的靜態電流,能使穩壓器輸出穩定。
4、時鍾電路
C54xx系列的時鍾端子為X1和X2/CLKIN,採用無源晶振提供時鍾信號,由於DSP有一組端子可以用來調整其工作頻率的高低,故對晶振頻率大小的選定沒有特別的要求,這里選用10Mhz的晶振。
5、復位電路
為了克服DSP系統因時鍾頻率較高導致在運行時可能發生的干擾和被干擾的現象,最好是使用具有監視(Watchdog)功能的自動復位電路,於是採用專門的自動復位晶元MAX706。MAX706的電源為3.1V~5.0V,低電平復位輸出,復位門限為3.08V。
6、未用端子處理
根據使用DSP晶元的相關原則,以及晶元手冊具體決定未用端子是接上拉電阻還是懸空。
7、基於上述的各部分電路組成,可以得出DSP數字濾波器的整體硬體電路連線圖,如下所示

程序設計
1、設計思路
⑴在DSP進行數字濾波運算前首先要進行初始化,只有正確設置了DSP的初始狀態才能保證晶元能正常運行。本系統主要進行以下兩方面的初始化:
①寄存器初始化:狀態寄存器ST0、狀態寄存器ST1、處理器模式控制寄存器PMST、軟體等待狀態寄存器SWWSR、組交換控制寄存器BSCR和時鍾模式寄存器等。
②中斷矢量表初始化:根據DSP晶元對各中斷矢量的設置位置編寫一個子程序;設置PMST控制寄存器;連接時將矢量表重定位到IPTR指定的地址。
⑵其次就是FIR 數字濾波的子程序設計,主要步驟如下:
①查詢SPCR11寄存器的第二位,當為1時說明read ready,將DRR11的值讀入AR3所指向的地址,該值為最新的采樣值。
②將最新的采樣值減去200h,然後AR3的值減1。
③執行MAC指令。
④將累加器的值送給變數Y,並將Y加上200h。
⑤查詢SPCR20寄存器的第二位,當為1時說明writeready,將Y值賦給DXR10,該值為濾波器輸出值。
⑥循環執行上面步驟。
2、程序流程圖
依據上述程序設計思路可以得到利用DSP實現FIR濾波器設計的程序流程圖,如下

3、程序代碼
由於初始化程序部分過於龐大繁雜,這里只給出用MAC指令編程實現FIR低通濾波器的程序片斷:
FILT_task1
LD Store_SICX,A
STLM A,ar4
STM #1,ar0 ;間址
STM #28,bk
LD DEM_Out,A
STL A,*ar4+% ;輸入信號:實部
STM #Coef_Tab1,ar5 ;濾波器實部系數地址
LD #0,A
STM #27,brc
RPTB SICXU-1
MAC *AR4+0%,*AR5+,A
SICXU LD A,-16,A ;低通濾波結果
LD C7FFF,B
MIN A
NEG B
MAX A
STL A,DEM_Out
LDM AR4,A
STL A,Store_SICX
RET
Coef_Tab1
.word 100 ;h(0)
.word 7 ;h(1)

… ;脈沖響應系數

.word -248
.word -71 ;h(N-1)
.end
總結
通過利用DSP的FIR濾波器設計,對DSP晶元的使用,以及利用DSP晶元組成的基本系統的相關電路有了比較深的認識。熟悉DSP晶元的系統設計和應用開發流程,並利用圖書館、網路、詢問同學等方式查找資料和解決相關的難題,這是最基礎的工作,也是最關鍵的步驟。這樣做可以培養自己的動手解決問題的能力和獨立思考的處事方法,使自己具有技術人員的氣質和工作態度,為將來的就業增加優勢。
數字濾波器是DSP的典型應用,學會了有助於觸類旁通,利於進一步的學習研究,能做到理解其他基於DSP的系統的功能和工作原理。掌握了基於DSP的應用開發,開闊了視野,增長了知識,是進入現代數字信號處理領域重要技能,乃至大規模集成電路的開發也是會用到的基礎,今後要予以重視並積極努力去學習。
求採納為滿意回答。

⑨ 我做 基於DSP的FFT演算法和FIR濾波器的設計與實現 現在有c語言編程出的程序了,我想改成用庫函數編寫。

DSP廠家會提供FFT和FIR的典型程序,樓主照葫蘆畫瓢即可

⑩ 二階濾波器用C語言怎麼寫

這個可比你想像的復雜多了,s是個復變數,1/(s+1)極點在-1,要想用C語言寫,必須理解清楚下面幾個問題:
1、輸入必須是個有限序列,比如(x+yi),x和y分別是兩個長度為N的數組
2、要過濾的頻率,必須是個整型值,或者是個整型區間
3、輸出結果同樣是兩個長度為N的數組(p+qi)
4、整個程序需要使用最基本的復數運算,這一點C語言本身不提供,必須手工寫復函數運算庫
5、實現的時候具體演算法還需要編,這里才是你問題的核心。

我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差別很大:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "complex.h"

extern "C" {

// Discrete Fourier Transform (Basic Version, Without Any Enhancement)
// return - Without Special Meaning, constantly, zero
int DFT (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);

CComplex F, X, T, W; int n, i;

long N = abs(count); long Inversing = count < 0? 1: -1;

for(n = 0; n < N ; n++){ // compute from line 0 to N-1

F = CComplex(0.0f, 0.0f); // clear a line

for(i = 0; i < N; i++) {

T = input[i];

W = HarmonicPI2(Inversing * n * i, N);

X = T * W;

F += X; // fininshing a line

}//next i

// save data to outpus
memcpy(output + n, &F, sizeof(F));

}//next n

return 0;
}//end DFT

int fft (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);

int N = abs(count); long Inversing = count < 0? -1: 1;

if (N % 2 || N < 5) return DFT(count, input, output);

long N2 = N / 2;

CComplex * iEven = new CComplex[N2]; memset(iEven, 0, sizeof(CComplex) * N2);
CComplex * oEven = new CComplex[N2]; memset(oEven, 0, sizeof(CComplex) * N2);
CComplex * iOdd = new CComplex[N2]; memset(iOdd , 0, sizeof(CComplex) * N2);
CComplex * oOdd = new CComplex[N2]; memset(oOdd , 0, sizeof(CComplex) * N2);

int i = 0; CComplex W;
for(i = 0; i < N2; i++) {
iEven[i] = input[i * 2];
iOdd [i] = input[i * 2 + 1];
}//next i

fft(N2 * Inversing, iEven, oEven);
fft(N2 * Inversing, iOdd, oOdd );

for(i = 0; i < N2; i++) {
W = HarmonicPI2(Inversing * (- i), N);
output[i] = oEven[i] + W * oOdd[i];
output[i + N2] = oEven[i] - W * oOdd[i];
}//next i
return 0;
}//end FFT

void __stdcall FFT(
long N, // Serial Length, N > 0 for DFT, N < 0 for iDFT - inversed Discrete Fourier Transform
double * inputReal, double * inputImaginary, // inputs
double * AmplitudeFrequences, double * PhaseFrequences) // outputs
{
if (N == 0) return;
if (!inputReal && !inputImaginary) return;
short n = abs(N);
CComplex * input = new CComplex[n]; memset(input, 0, sizeof(CComplex) * n);
CComplex * output= new CComplex[n]; memset(output,0, sizeof(CComplex) * n);
double rl = 0.0f, im = 0.0f; int i = 0;
for (i = 0; i < n; i++) {
rl = 0.0f; im = 0.0f;
if (inputReal) rl = inputReal[i];
if (inputImaginary) im = inputImaginary[i];
input[i] = CComplex(rl, im);
}//next i
int f = fft(N, input, output);

double factor = n;
//factor = sqrt(factor);

if (N > 0)
factor = 1.0f;
else
factor = 1.0f / factor;
//end if

for (i = 0; i < n; i++) {
if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor;
if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor;
}//next i
delete [] output;
delete [] input;
return ;
}//end FFT

int __cdecl main(int argc, char * argv[])
{
fprintf(stderr, "%s usage:\n", argv[0]);
fprintf(stderr, "Public Declare Sub FFT Lib \"wfft.exe\" \
(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \
ByRef freqAmplitude As Double, ByRef freqPhase As Double)");
return 0;
}//end main

};//end extern "C"