① 利用c語言設計滑窗檢測器或雙極點濾波器演算法,並在DSP上實現
利用C語言設計滑窗檢測器或雙極點濾波器演算法,並在DSP上實現 原創一份
② 在DSP中實現FFT演算法,C語言編寫,編譯成功,但是鏈接失敗,報錯為重復定義宏變數,請高手指教。
遇到過相同的問題,是調用的函數在dsp的編譯環境中不支持。
比如ITOA()等,編譯是沒有問題的,但是鏈接的時候就會出錯。
檢查一下使用的函數是不是可以被使用吧。
③ 關於DSP的 C語言編程
這個還得結合具體點的解壓演算法來理解啊 只看這樣的根據段落碼來分別處理 沒看演算法真心看不懂具體的為什麼這么操作 肯定是有演算法依據的 結合文檔看吧
④ DSP可不可以用C語言寫
當然可以啦... 只要有編譯開發環境,比如Code Composer Studio,編譯就可以了
⑤ DSP實驗 讓我用C語言編寫程序完成計算sin(2.3π)+cos(1.7π)的值
何編程語言是難學的,真正的工作中有時候學習一個新語法只有不到一周的時間,語法而言都一樣,如果還停留在語法層學習的上面,編寫程序的道路你就連門都沒有入.
但是後續的 數據結構和演算法 稍微要看下書了,開始接觸演算法了,著和語法沒有關系,之所以要先學好語法是為了能看懂用語法描敘的演算法,學通了用任何語言來描敘都一樣,到了這個階段的就相當於抬起一條腿准備跨到起跑線一樣,但還是沒有入門.
到編譯原理 和 圖靈機 再到 自己編寫微型的操作系統 就需要有個老師來引導了
我學軟體開發就是從C開始一路由 ->國家資料庫3級-> 程序員->高級程序員->系統分析師考上去然後通過近9年的工作,體會是如果你能夠在市面上或者學校里精確買到或者學到的一門知識往往就表示你的層次還是不能讓你得興應手的在行業中創造你能想像的東西,真正的解決問題需要很多本書再加上80%以上的自己創造和理解才能做出來的時候才算真正懂得了你的工作.
一個程序員需要這樣的經歷
樓上的估計最高學歷不過是理工科的一個大學生,應該還沒畢業,沒有在計算機行業呆過,在做晶元處理的工作中比如DSP晶元設計需要你天天接觸演算法,但是這和C語言本身有關系嗎?傅立葉演算法是數學家傅立葉設計出來的數學模型但是不適合做在計算機軟體裡面(運算量太大了比如離散的傅立葉變換等同於用序列Y(n×1列矢量)乘以n×n矩陣Fn,需要n×n次乘法。若n=1024,則是104,8576次乘法運算。什麼概念呢?如果你選用的CPU單周期指令為25ns, 單周期也可以完成一次乘法運算,那麼要計算1024點的傅立葉變換則需要26.2144ms,這還不包括加法或其它運算),我給出C演算法如下:
void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)
{
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;
for (it=0; it<=n-1; it++)
{
m = it;
is = 0;
for(i=0; i<=k-1; i++)
{
j = m/2;
is = 2*is+(m-2*j);
m = j;
}
fr[it] = pr[is];
fi[it] = pi[is];
}
//----------------------------
pr[0] = 1.0;
pi[0] = 0.0;
p = 6.283185306/(1.0*n);
pr[1] = cos(p);
pi[1] = -sin(p);
if (l!=0)
pi[1]=-pi[1];
for (i=2; i<=n-1; i++)
{
p = pr[i-1]*pr[1];
q = pi[i-1]*pi[1];
s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i] = p-q;
pi[i] = s-p-q;
}
for (it=0; it<=n-2; it=it+2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr+fr[it+1];
fi[it] = vi+fi[it+1];
fr[it+1] = vr-fr[it+1];
fi[it+1] = vi-fi[it+1];
}
m = n/2;
nv = 2;
for (l0=k-2; l0>=0; l0--)
{
m = m/2;
nv = 2*nv;
for(it=0; it<=(m-1)*nv; it=it+nv)
for (j=0; j<=(nv/2)-1; j++)
{
p = pr[m*j]*fr[it+j+nv/2];
q = pi[m*j]*fi[it+j+nv/2];
s = pr[m*j]+pi[m*j];
s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr = p-q;
poddi = s-p-q;
fr[it+j+nv/2] = fr[it+j]-poddr;
fi[it+j+nv/2] = fi[it+j]-poddi;
fr[it+j] = fr[it+j]+poddr;
fi[it+j] = fi[it+j]+poddi;
}
}
if(l!=0)
for(i=0; i<=n-1; i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}
if(il!=0)
for(i=0; i<=n-1; i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
if(fabs(fr[i])<0.000001*fabs(fi[i]))
{
if ((fi[i]*fr[i])>0)
pi[i] = 90.0;
else
pi[i] = -90.0;
}
else
pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;
}
return;
}
另外,虛機團上產品團購,超級便宜
⑥ DSP可以用C語言開發對大數組每個元素執行相同操作的處理函數並並發執行嗎謝謝!
C語言設計有點懸,比較復雜,必須加許多限制,編輯結果才能滿足你的要求,而且還要參看編譯出的匯編中間文件以檢查是否OK。而且c程序有許多多餘的保護性操作應當被剔除以免影響效率。所以不適於用c編寫這樣的演算法程序,至少要用c內嵌匯編的形式。
一般這樣的要求需要用匯編編寫,而且並行指令涉及較復雜的匯編格式,需要在編寫時告訴編譯器哪些操作是並行的,需要自己根據具體DSP匯流排和流水線特點考慮如何並行地完成取數、計算和送數。難度較高。
⑦ dsp c語言編程
這個也太廉價了吧
畢業設計還是要自己搞得
⑧ 對DSP而言,CCS用C語言編程和匯編編程,二者的效率相差多少
我用的是28XX系列的,不知道經驗對你有沒有用,因為不同系列的晶元多少有些差別。
TI提供的庫已經相當可以了,兼顧易用與效率。我當時做過這樣的測試
1. 用IQMATH實現
2. 直接C語言實現
3. C語言優化實現
4. 原生匯編實現
IQMATH的運行周期在1000左右,比方案3快幾十個周期,比方案4慢幾個周期,方案2是10000多個周期。
另外,因為只是單獨測的演算法,匯編之所以快是快在寄存器的使用上,操作數可以直接入寄存器,但是考慮到程序其他部分是用C語言編寫的話,把操作棧的時間也加上,並不比方案1快。畢竟我對TI的匯編吃的也不透。
在編寫上,無疑是方案1提供了最接近C語言風格的實現,幾乎不用考慮ISA方面的問題。
另外對於執行效率,我覺得主要考慮三點:
1.分支的使用
CCS對C語言的優化我沒做過太多比對。其實單從反匯編的結果看,我接觸過的嵌入式開發環境的編譯器都能做出很好的優化。但是幾乎每個編譯器都會在邏輯的優化上有欠缺——它只能對一些顯而易見的判斷條件進行優化,而在寫程序的過程中,我們經常出於易讀性的考慮,或者穩定性的考慮,或者其他的考慮加入幾乎不會發生的分支,這樣的分支判斷會消耗一定比率的代碼段執行效率,視乎代碼段內有用功能的長度而定,越長這個比率越小,越短這個比率越高。
2.一般操作,就是各種賦值操作
在一般的操作上,編譯器的優化已經很令人滿意了,基本上可以作為編寫匯編的範本。我覺得所謂效率能達到90%就是針對這個部分說的。
3.特殊操作,比如對整塊內存的操作,或者是浮點運算上。
在一些特殊的操作上,就要看是否有現成的庫,或者看硬體是否支持。比如對整塊內存操作就別用循環一個位元組一個位元組的搬了。
以上三點都能考慮到的話,相信執行效率方面已經沒有太大的提升空間了。
另外如果你的代碼發生在初始化部分,也就是只在系統運行開始的時候運行一次,那麼優化不優化其實沒有太大的必要,除非你對系統初始化的時間有嚴格的要求。但是如果你的代碼是作為任務要被反復運行的,那就有優化的必要了。
在CCS里有代碼消耗時鍾周期的統計,如果你覺得某段代碼效率低下的話,可以先分段進行消耗時鍾周期的計算,這樣優化比較有針對性。
⑨ 怎樣進行DSP的C語言編程
在CCS里寫C語言程序啊……
⑩ 如何用C語言開發DSP嵌入式
①匯編語言生成的程序對應的二進制代碼少,程序執行要比高級語言生成的程序快; ②控制器剛問世時,沒有相應的高級語言可供使用; ③存儲器的價格問題和定址空間的限制。