看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code::Block 寫C 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) matlab的fdatool 問題(Question): 因為我接下來要做的是有45個case 自己用2個case來做是成功的 我想知道該何做能更簡潔 餵入的資料(Input): input是相同的512筆data 經由case去選擇不同的處理方式 預期的正確結果(Expected Output): 目前測試是正確的 沒有錯誤 只是想要知道有沒有更好的方法 錯誤結果(Wrong Output): 目前測試是正確的 沒有錯誤 只是想要知道有沒有更好的方法 程式碼(Code):(請善用置底文網頁, 記得排版) void A (void); void D (void); char c; printf("enter A=120_480 or D=180_480 = "); scanf ("%c", &c); switch (c) { case 'A': break; case 'D': break; defult break; } 補充說明(Supplement): 因為我是要做濾波器(fir filter - bandpass) 我希望能給使用者自己選擇頻率(0~540hz,每60hz為一單位) 所以我總共要做C10取2 有45個case要做 這裡再補充一下: 因為選擇的範圍可以是 0~60, 0~120, 0~180, .... ,0~540 60~120, 60~180, 60~240, ... ,60~540 ... ... 420~480, 420~540 480~540 而每一個範圍經由matlab的fdatool都會產生一個fdacoefs.h 而每一個.h檔裡面會有一個陣列 我目前作法就是把 matlab的fdatool所產生的45個fdacoefs.h合併為一個.h檔 然後在使用者介面直接寫死 ex: printf("enter A=120_480 or D=180_480 = "); 就是直接給使用者看著指令選擇 但是我想做到的是給使用者自動輸入想要的頻寬 只是覺得這樣對使用者比較方便,不用把我45個代號看完就可以自動輸入這樣 這樣的作法會比較省時間和空間嗎? 另外對於我上述想做的方式,我該找甚麼資料參考呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.28.223 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433230610.A.D55.html
Feis: C or C++ ?. 不過其實應該好好想想真的有 45 cases 嗎06/02 16:21
用C,後來改成60為一單位,取0~540 這樣既是45個case 原本所說的應該是55個才對 ※ 編輯: totemist (140.114.87.231), 06/02/2015 16:22:17
Feis: 先退一萬步來想, 你 fdacoefs.h 裡面是只有陣列嗎? 06/02 16:26
Feis: 如果是的話, 你怎麼將 45 個陣列合併? 06/02 16:26
只有陣列,fdacoefs.h 會有 頻率100~500 const int BL = 82; const real64_T B[82] = { ... } 因為不同頻率的coef不一樣,只要將這矩陣的變數改一下即可 頻率200~600 const int CL = 82; const real64_T C[82] = { ... } 當然我目前的做法就會讓 .h和主程式就會變得很冗長
Feis: 然後最後再想想你可以把這個選擇問題變成一個索引對照問題嗎 06/02 16:28
Frozenmouse: 所以輸入會轉變兩個頻率,A=100,200、D=500,600 06/02 18:36
Frozenmouse: 我有理解錯嗎?@@ 06/02 18:36
那個意思是 選擇A的話 bandpassfilter 只會留下100~500hz範圍內的頻率 選擇B的話 bandpassfilter 只會留下200~600hz範圍內的頻率 所以我目前的設計 就是讓使用者 按 A or B 這樣 ※ 編輯: totemist (140.114.28.223), 06/02/2015 19:59:31 我算是有想法了 就是在另一個變數level讓Fpass1和Fpass2合併起來,這樣應該能避免重複問題 int Fpass1 = 0; int Fpass2 = 0; int level =0; printf("enter Fpass1 = "); scanf ("%d", &Fpass1); printf("enter Fpass2 = "); scanf ("%d", &Fpass2); if (Fpass1==0) level = Fpass2*10000; else level = Fpass2*1000+Fpass1; switch(level) 看還有沒有甚麼可以討論囉~ ※ 編輯: totemist (140.114.28.223), 06/02/2015 21:46:59
Feis: 我的意思是要你把它變成一個類似二維陣列, 用頻率去索引 06/02 21:54
Feis: 更實際的做法其實應該是自己算 coef, 不過我想就算了 06/02 21:55
※ 編輯: totemist (36.228.225.58), 06/03/2015 00:09:06 ※ 編輯: totemist (36.228.225.58), 06/03/2015 00:12:03
jackylu63: 這個問,聽起來建一個表就可以了 06/03 01:03
Frozenmouse: 所以跟我之前想的應該差不多,只是我沒表達清楚 Orz 06/03 08:06
Frozenmouse: 你可以考慮把coefs弄成三維表格,概念上以兩個頻率為 06/03 08:07
Frozenmouse: 前兩個維度,第三維就是係數 06/03 08:07
Frozenmouse: 輸入也讓使用者直接給頻率就好,非60倍數再處理 06/03 08:07
Frozenmouse: 啊,其實就是tropical72大說的方法…XD 06/03 08:09
WYchuang: 現在我遇到這種的都會想搞個xml檔案 有人跟我一樣嗎 xD 06/03 09:50
MOONRAKER: 並不會 06/03 11:10