當前位置:首頁 » 編程軟體 » 混合編譯原理

混合編譯原理

發布時間: 2023-09-14 02:18:51

『壹』 語音編碼的編碼的分類

語音編碼就是對模擬的語音信號進行編碼,將模擬信號轉化成數字信號,從而降低傳輸碼率並進行數字傳輸,語音編碼的基本方法可分為波形編碼、參量編碼(音源編碼)和混合編碼,波形編碼是將時域的模擬話音的波形信號經過取樣、量化、編碼而形成的數字話音信號,參量編碼是基於人類語言的發音機理,找出表徵語音的特徵參量,對特徵參量進行編碼,混合編譯碼是結合波形編解碼和參量編解碼之間的優點。波形編解碼器雖然可提供高話音的質量,但數據率低於16kb/s的情況下,在技術上還沒有解決音質的問題。 基本原理是在時間軸上對模擬話音信號按照一定的速率來抽樣,然後將幅度樣本分層量化,並使用代碼來表示。在接收端將收到的數字序列經過解碼恢復到原模擬信號,保持原始語音的波形形狀。話音質量高,編碼速率高。如PCM編碼類(a率或u率PCM、ADPCM、ADM),編碼速率為64-16kb/s,語音質量好。
波形編碼的目的在於盡可能精確地再現原來的語音波形,並以波形的保真度即自然度為其質量的主要度量指標,但波形編碼所需的碼速率較高。 根據語音信號產生的數學模型,通過對語音信號特徵參數的提取後進行編碼(將特徵參數變換成數字代碼進行傳輸)。在接收端將特徵參數,結合數學模型,恢復語音,力圖使重建語音保持盡可能高的可懂度,重建語音信號的波形同原始語音信號的波形可能會有相當大的區別。如線性預測(LPC)編碼類。編碼速率低,2.4-1.2kb/s,自然度低,對環境雜訊敏感。
這種語音編碼的主要質量指標是可懂度,參量編碼可以將語音編碼以後的速率壓得很低。 將波形編碼與參數編碼相結合,在2.4-1.2kb/s速率上能夠得到高質量的合成語音。混合編碼把波形編碼的高質量和參量編碼的高效性融為一體,在參量編碼的基礎上附加一定的波形編碼特徵,實現在可懂度的基礎上適當地改善自然度的目的。
用於移動通信中的語音編碼一般都是混合編碼。選擇混合編碼時,要使比特率、質量、復雜度和處理時延這4個參量及其關系達到綜合最佳化。 語音中最基本的元素是音素,大約有128~256個,如果按通常的說話速度,每秒平均發出10個音素,則信息率為:I=[log2(256)10]bps=80bps
把發音看成是以語音速率來傳送,則語音編碼的極限速率為80bps,從數字化標準的編碼速率64kbps,到極限速率80bps,之間的距離,對於理論研究和實踐有著極大的吸引力。

『貳』 求C++程序設計:四則混合運算表達式的解析與計算

double PostCalculate::calculate(std::string *p,int size)
{
std::stack<string> a;
std::string postExp[20];
int count=0; //對 後綴表達式 計數
for(int i=0;i<size;i++)
{
if(!isSign(p)) //若不是符號 ,即為數字
{
postExp[count]=*p; //將數字直接放入後綴表達式
count++;
}

else if(*p=="+" ||*p=="-")
{
while(!a.empty() && a.top()!="(") //彈出棧中元素直到 棧空 或者 左括弧
{
postExp[count]=a.top();
count++;
a.pop();
}
a.push(*p); //將當前元素壓棧
}
else if(*p=="*" || *p=="/")
{
while(!a.empty() && a.top()!="(" && a.top()!="+" && a.top()!="-")
{
postExp[count]=a.top();
count++;
a.pop();
}
a.push(*p);
}
else if(*p=="(")
{
a.push(*p);
}
else if(*p==")")
{
while(!a.empty() && a.top()!="(")
{
postExp[count]=a.top();
count++;
a.pop();
}
if(!a.empty() && a.top()=="(")
a.pop();
}
p++;
}
while(!a.empty())
{
postExp[count++]=a.top();
a.pop();
}
double result=postCal(postExp,count);
return result;
}
std::string PostCalculate::dispose(std::string first, std::string second, std::string op)
{
stringstream t;
double r;
double a=stringToDouble(first);
double b=stringToDouble(second);
if(op=="+")
r=a+b;
else if(op=="-")
r=a-b;
else if(op=="*")
r=a*b;
else if(op=="/")
r=a/b;
t<<r;
return t.str();
}
double PostCalculate::postCal(std::string *p,int size)
{
std::stack<string> res;
for(int i=0;i<size;i++)
{
if(!isSign(p)) //遇到數字 壓棧
res.push(*p);
else //遇到符號
{
string f=res.top(); //取第2操作數
res.pop();
string s=res.top();//取第1操作數
string r=dispose(s,f,*p);
res.push(r);
}
p++;
}

return stringToDouble(res.top());
}
inline bool PostCalculate::isSign(std::string* s)
{
return (*s=="+"|| *s=="-"|| *s=="*"|| *s=="/"|| *s=="("|| *s==")");
}
inline double PostCalculate::stringToDouble(std::string c) //通過流 實現轉換 String -> Double
{
double temp;
stringstream a;
a.str(c);
a>>temp;
return temp;
}

入口函數是pCal.calculate(expression,num)//參數1 是string數組,參數2是數組實際個數,程序里設計是字元數不超過20個,想修改可以在PostCalculate::calculate函數的第4行修改

『叄』 怎麼實現c語言與匯編語言的混合編程

這個問題有很多做法。如果你的匯編語句比較簡單可以採用樓上的做法。
如果的你的匯編比較大,可以寫成另外一個匯編文件*.asm。然後根據你的編譯器給你的指令,把你的匯編函數抽象出C語言聲明。做成*.h文件,供其他人調用。這是現在比較流行的底層API開發模式。
如 我把需要用匯編語句寫的功能寫一個匯編文件 asm_main.asm,我在該文件的前面 加一句 XDEF asm_main(這是我的編譯器的規定,用XDEF),然後在asm_main.h里聲明(就是典型的C聲明 如 U16 asm_main())。這樣你在你的C程序中如果用到匯編功能,只要#include "asm_main.h" 就可以調用用匯編寫的函數了。對於大規模的軟體開發,這是個很重要的方法。它提供了二次介面供上層調用。你可以把所有硬體驅動或底層API都寫成這樣子。C語言開發者就不需要了解底層硬體細節了。而且底層匯編的改動也不會影響C。這樣你開發的C程序可移植性就高了。當然,你還需要些編譯原理的知識。如,在匯編里,asm_main函數只是個標號,寫成asm_main: 對吧,但是如果你需要些入口參數怎麼辦?比如你要抽象出U16 asm_main(char ,char *),這個時候你要考慮參數是怎樣入棧的,一般是從右到左依次壓棧的,等等還有些問題。
現在的大學本科教育只教一些單片機開發的小技能,沒有一個系統的概念。我很願意把我工作中得來的經驗與大家分享。

『肆』 編譯原理的相關程序

解釋程序(interpreter):解釋程序是如同編譯器的一種語言翻譯程序。它與編譯器的不同之處在於:它立即執行源程序而不是生成在翻譯完成之後才執行的目標代碼。從原理上講,任何程序設計語言都可被解釋或被編譯,但是根據所使用的語言和翻譯情況,很可能會選用解釋程序而不用編譯器。例如, 我們經常解釋BASIC語言而不是去編譯它。類似地,諸如LISP 的函數語言也常常是被解釋的。
解釋程序也經常用於教育和軟體的開發,此處的程序很有可能被翻譯若干次。而另一方面,當執行的速度是最為重要的因素時就使用編譯器,這是因為被編譯的目標代碼比被解釋的源代碼要快得多,有時要快10倍或更多。但是,解釋程序具有許多與編譯器共享的操作,而兩者之間也有一些混合之處。 代碼生成(code generator):代碼生成器得到中間代碼(IR),並生成目標機器的代碼。正是在編譯的這個階段中,目標機器的特性成為了主要因素。當它存在於目標機器時,使用指令不僅是必須的而且數據的形式表示也起著重要的作用。例如,整型數據類型的變數和浮點數據類型的變數在存儲器中所佔的位元組數或字數也很重要。在上面的示例中,現在必須決定怎樣存儲整型數來為數組索引生成代碼。例如,下面是所給表達式的一個可能的樣本代碼序列(在假設的匯編語言中):
M O V R0,index ;;
value of index -> R0 M U L R0,2 ;;
double value in R0 M O V R1,&a ;;
address of a -> R1 A D D R1,R0 ;;
add R0 to R1 M O V *R1,6 ;;
constant 6 -> address in R1
在以上代碼中,為編址模式使用了一個類似C的協定,因此& a是a的地址(也就是數組的基地址),* R1則意味著間接寄存器地址(因此最後一條指令將值6存放在R1包含的地址中)。這個代碼還假設機器執行位元組編址,並且整型數占據存儲器的兩個位元組(所以在第2條指令中用2作為乘數)。 目標代碼(target code optimizer ):在這個階段中,編譯器嘗試著改進由代碼生成器生成的目標代碼。這種改進包括選擇編址模式以提高性能、將速度慢的指令更換成速度快的,以及刪除多餘的操作。在上面給出的樣本目標代碼中,還可以做許多更改:在第2條指令中,利用移位指令替代乘法(通常地,乘法很費時間),還可以使用更有效的編址模式(例如用索引地址來執行數組 存儲)。使用了這兩種優化後,目標代碼就變成:
MOV R0,index ;;
value of index -> R0 SHL R0 ;;
double value in R0 MOV &a[R0],6 ;;
constant 6 -> address a + R0
到這里就是編譯原理的簡要描述,但還應特別強調編譯器在其結構細節上差別很大。

『伍』 尋求pascal計算四則混合運算的原理

在編譯原理里有講,利用堆棧.
我來簡單的說下.
程序中有2個棧,一個放數值,一個放操作符

A 程序開始後,第一次的操作符和數值先入棧
B 獲取下一個操作符NextOP
C 把NextOP和棧頂操作符進行優先順序比較

情況1.NextOP優先順序比棧頂操作符要高的話,把NextOP壓入操作符棧.繼續步驟B
情況2.NextOP優先順序比棧頂操作符要低的話,用棧頂運行符,數值棧拿頂的2個值做運算,運算結果壓入數值棧.重復步驟C 如果操作符棧為空,運算結束,步驟D

D 運算結果在數值棧
回答者: cpplyy - 千總 四級 10-8 09:12
1.分治搜索法 每次找到最後運算的符號,對其左右分別深搜到出結果為止
2.堆棧處理法 分數棧與符號棧 先定義常量數組(判斷運算\入棧\錯誤),然後從左到右依次運算 數進數棧 符號與符號棧內比較運算\入棧\錯誤操作 運算從數棧里拿數與後面的計算 然後結果入數棧 最後結果在數棧里
回答者: LXYXYNT - 舉人 四級 10-8 12:50
堆棧就行了
回答者: sd542927172 - 見習魔法師 二級 10-9 20:09
堆棧

表達式的計算應用相當廣泛,比如電力調度系統中的計算遙測、車站票務系統中的票價類型計算公式等。
本文講述中置表達式轉換為後置表達式和後置表達式的求值演算法,並給出實現的C++源代碼,同時給出一個相當簡潔的堆棧C++模板類。

中綴表達式到後綴表達式的轉換
要把表達式從中綴表達式的形式轉換成用後綴表示法表示的等價表達式,必須了解操作符的優先順序和結合性。優先順序或者說操作符的強度決定求值順序;優先順序高的操作符比優先順序低的操作符先求值。 如果所有操作符優先順序一樣,那麼求值順序就取決於它們的結合性。操作符的結合性定義了相同優先順序操作符組合的順序(從右至左或從左至右)。
轉換過程包括用下面的演算法讀入中綴表達式的操作數、操作符和括弧:
1. 初始化一個空堆棧,將結果字元串變數置空。
2. 從左到右讀入中綴表達式,每次一個字元。
3. 如果字元是操作數,將它添加到結果字元串。
4. 如果字元是個操作符,彈出(pop)操作符,直至遇見開括弧(opening parenthesis)、優先順序較低的操作符或者同一優先順序的右結合符號。把這個操作符壓入(push)堆棧。
5. 如果字元是個開括弧,把它壓入堆棧。
6. 如果字元是個閉括弧(closing parenthesis),在遇見開括弧前,彈出所有操作符,然後把它們添加到結果字元串。
7. 如果到達輸入字元串的末尾,彈出所有操作符並添加到結果字元串。

後綴表達式求值
對後綴表達式求值比直接對中綴表達式求值簡單。在後綴表達式中,不需要括弧,而且操作符的優先順序也不再起作用了。您可以用如下演算法對後綴表達式求值:
1. 初始化一個空堆棧
2. 從左到右讀入後綴表達式
3. 如果字元是一個操作數,把它壓入堆棧。
4. 如果字元是個操作符,彈出兩個操作數,執行恰當操作,然後把結果壓入堆棧。如果您不能夠彈出兩個操作數,後綴表達式的語法就不正確。
5. 到後綴表達式末尾,從堆棧中彈出結果。若後綴表達式格式正確,那麼堆棧應該為空。

寫在這里不方便,講解的話+Q244957727
給分拉給分啦~
回答者: wind_teller - 魔法師 四級 10-10 21:57
表達式的計算應用相當廣泛,比如電力調度系統中的計算遙測、車站票務系統中的票價類型計算公式等。
本文講述中置表達式轉換為後置表達式和後置表達式的求值演算法,並給出實現的C++源代碼,同時給出一個相當簡潔的堆棧C++模板類。

中綴表達式到後綴表達式的轉換
要把表達式從中綴表達式的形式轉換成用後綴表示法表示的等價表達式,必須了解操作符的優先順序和結合性。優先順序或者說操作符的強度決定求值順序;優先順序高的操作符比優先順序低的操作符先求值。 如果所有操作符優先順序一樣,那麼求值順序就取決於它們的結合性。操作符的結合性定義了相同優先順序操作符組合的順序(從右至左或從左至右)。
轉換過程包括用下面的演算法讀入中綴表達式的操作數、操作符和括弧:
1. 初始化一個空堆棧,將結果字元串變數置空。
2. 從左到右讀入中綴表達式,每次一個字元。
3. 如果字元是操作數,將它添加到結果字元串。
4. 如果字元是個操作符,彈出(pop)操作符,直至遇見開括弧(opening parenthesis)、優先順序較低的操作符或者同一優先順序的右結合符號。把這個操作符壓入(push)堆棧。
5. 如果字元是個開括弧,把它壓入堆棧。
6. 如果字元是個閉括弧(closing parenthesis),在遇見開括弧前,彈出所有操作符,然後把它們添加到結果字元串。
7. 如果到達輸入字元串的末尾,彈出所有操作符並添加到結果字元串。

後綴表達式求值
對後綴表達式求值比直接對中綴表達式求值簡單。在後綴表達式中,不需要括弧,而且操作符的優先順序也不再起作用了。您可以用如下演算法對後綴表達式求值:
1. 初始化一個空堆棧
2. 從左到右讀入後綴表達式
3. 如果字元是一個操作數,把它壓入堆棧。
4. 如果字元是個操作符,彈出兩個操作數,執行恰當操作,然後把結果壓入堆棧。如果您不能夠彈出兩個操作數,後綴表達式的語法就不正確。
5. 到後綴表達式末尾,從堆棧中彈出結果。若後綴表達式格式正確,那麼堆棧應該為空
在編譯原理里有講,利用堆棧.
我來簡單的說下.
程序中有2個棧,一個放數值,一個放操作符

A 程序開始後,第一次的操作符和數值先入棧
B 獲取下一個操作符NextOP
C 把NextOP和棧頂操作符進行優先順序比較

情況1.NextOP優先順序比棧頂操作符要高的話,把NextOP壓入操作符棧.繼續步驟B
情況2.NextOP優先順序比棧頂操作符要低的話,用棧頂運行符,數值棧拿頂的2個值做運算,運算結果壓入數值棧.重復步驟C 如果操作符棧為空,運算結束,步驟D

D 運算結果在數值棧
.分治搜索法 每次找到最後運算的符號,對其左右分別深搜到出結果為止
2.堆棧處理法 分數棧與符號棧 先定義常量數組(判斷運算\入棧\錯誤),然後從左到右依次運算 數進數棧 符號與符號棧內比較運算\入棧\錯誤操作 運算從數棧里拿數與後面的計算 然後結果入數棧 最後結果在數棧里

熱點內容
微信清除朋友圈緩存 發布:2024-11-19 10:32:08 瀏覽:138
3ds編程 發布:2024-11-19 10:31:14 瀏覽:229
mac如何修改賬戶密碼變成普通用戶 發布:2024-11-19 10:23:05 瀏覽:875
接龍源碼 發布:2024-11-19 10:14:48 瀏覽:33
驅動軟體哪個安卓版好 發布:2024-11-19 10:08:28 瀏覽:703
伺服器一鍵搭建java環境 發布:2024-11-19 10:08:27 瀏覽:729
布丁少兒編程 發布:2024-11-19 09:57:11 瀏覽:98
vb資料庫數組 發布:2024-11-19 09:23:40 瀏覽:828
安卓游戲數據保存在哪裡找 發布:2024-11-19 09:22:02 瀏覽:310
解壓出來的文件亂碼 發布:2024-11-19 09:15:40 瀏覽:940