English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

小弟C語言剛入門
以下是我想做的動作
1.利用8051+Keil C讀取一WAV(WMV)檔進buffer
(有外加DRAM, 可直接讀取完整檔案)
2.將讀取入buffer的字串轉換成數字
(例: 現有FFFEFDFC一組字串,
希望系統可以判讀為0xFF, 0xFE, 0xFD, 0xFC 四組數字)
3.將16進制數字轉為10進制小數
(例: 0xFF經過運算(255/128)-1=0.9921875 換為小數)
4.將數字丟給FFT運算
(有找到程式, 網址: http://rafb.net/p/ojvjHK57.html
但是該程式與MATLAB比較計算結果發現不符
已詳細對過課本, 找不到錯誤)

以上是想要做的動作...
以下是想問的問題:
1.聲音檔案有檔頭, 要怎麼在讀取資料時去除檔頭?
2.如何把字串判讀為上述的16進制數(0xFF)?
3.要怎麼利用迴圈把16進制換成10進制小數?
4.請幫幫我更正FFT程式的錯誤

在此奉上點數20點
請各位前輩指導
感謝

註:該FFT程式為Numerical Recipes In C課本中之範例程式

2007-03-23 16:41:46 · 2 個解答 · 發問者 Jamie Tsai 1 in 電腦與網際網路 程式設計

Jacob大...
您的意思是要把所有的東西都讀進去
等判斷過後再把檔頭丟掉?
不用轉換的意思是說只要指定形式正確,
不用作進制轉換一樣可以做運算?
FFT是哪一種?
Discrete Fourier Transform of two real functions simutaneously
是這樣嗎?
對於WAV的想法...
我腦袋裡的觀念是要把0xFFFF換成-0.000030517578125
才可以用FFT去運算
就是你的意思...把"整數"換成"實數"再去FFT
不過聽說這樣運算速度會慢很多
請您給我建議...我對於這些觀念實在是不清楚

2007-03-30 13:28:05 · update #1

2 個解答

1. 不可去!去了頭,你怎知那是什麼樣的檔?
 頭要拿來判斷。判斷完了,可以不用它了。
2. 它不是你想的那樣喔!
3. 不用!16進與10進都是數值!
 你硬要把它轉成〝10進〞(如BCD),電腦反而算得慢!
4. 改天囉,不過我可能沒空。
讀頭、顯數值的C程式寫好了。
拿去參考看看。
(這個程式用C++比較好)
奇怪了,別人實習生 5 級就沒字數限制了。
我的到現在還是有!
圖片參考:http://tw.yimg.com/i/tw/blog/rte/smiley_17.gif

待會兒上來補 link 給你



2007-03-29 21:48:27 補充:
http://jacob_grace.250free.com/DAT/Wav.cpp

這是個親中國、反台灣的美國站。

如果在台灣不能下載,再寫信告訴我。

2007-03-29 23:06:20 補充:
FFT 有 N 種!
你要的是哪一種?
Wav 裡的是 整數,
你是要把它轉成 -1 ~ 1 的〝實數〞,再用 float / double 去 FFT?

不弄清楚你要的是啥,光去網站上找,沒有用

2007-03-30 21:44:45 補充:
回答來信問題:
1. 檔頭:
判斷檔案完,就可以不理檔頭了。
至於要先讀再不理、讀完再不理,沒差。
但不讀檔頭,怎知它是立體、單音;+-32767、+-21億;有沒有壓縮……等的記錄方式?
只要知道這些,檔頭就沒用了。
別去宣傳說這是 Jacob 教你的:
 狡兔死,走狗烹……

2. 進位轉換:
信中寫的是對的。
你看我寫的程式,有任進位轉換嗎?
所以,在我的程式中,知道它是+-32767還是+-21億後,
用對應的short 或 long 去把它 print out,值不就出來了?
這就是我說的:不用轉換。

2007-03-30 21:45:05 補充:
3. FFT 本來就不快!
它每一步都挺慢的!
但它因為是 O(n log n),所以才快!
FFT 不可能在整數下算!
一定要轉成複數!
而複數就是〝實數〞+ i 〝實數〞
只要型式對了,i 可以不用寫。
FFT最大的缺點是誤差:電腦裡,實數運算沒有沒誤差的!
所以,只何讓 FFT 的誤差變小,是寫 FFT 時要注意的問題。

2007-03-30 21:45:10 補充:
解決的方法有:
1. 全部用 double, long double。
 優點:簡單、好寫。
 缺點:慢!long double 要 compiler 有支援才有用!
2. 用更高的準度(float -> double, double -> long double) 先去把它用得到的 roots of unity 算出來。(這就可以加速囉!)
 再用用得到的準度(float 或 double) 去算 FFT 的東東。
 (這樣又快又準。)

2007-03-29 17:36:51 · answer #1 · answered by ? 7 · 0 0

1.聲音檔案有檔頭, 要怎麼在讀取資料時去除檔頭?
*特定檔案有其格式,要找出格式,才知道如何抓取資料.
*抱歉不知道WAV格式.

2.如何把字串判讀為上述的16進制數(0xFF)?
*字串?
*一般檔案開啟,讀進來的就是資料.
*資料的判讀端視你以何種方式呈現.
*當Data=65, 則char = 'A', int = 0x41.

3.要怎麼利用迴圈把16進制換成10進制小數?
*如果只是單純數學運算,不考慮文字化,則以C運算式即可.不需迴圈.
*一是轉成浮點數, float變數 = (float)( (data/128) - 1 );
*二是以整數計算, 32bits變數 = data*1000000/128 - 1;

4.請幫幫我更正FFT程式的錯誤
*sorry, I don't know.

2007-03-24 02:54:38 · answer #2 · answered by John 6 · 0 0

fedest.com, questions and answers