2017-04-05 29 views
0

嗨我在理解頻率切割以及如何將它們添加到命令行中時有點麻煩,我想在命令中編寫什麼線音頻編程SDL - 如何使用wav文件指定命令行頻率的削減

sound.exe 230 dbz.wav 其中230是頻率在230赫茲切

我可以加載wav文件罰款只是我失去了作爲我應該如何指定的切頻率這是我迄今爲止寫的

if (argc <= 1) { 
     fprintf(stderr, "Usage %s <input wav file>\n", argv[0]); 
     return(1); 
    } 
    if (argv[1] == "NULL") // NUll for now as dont know how to specify the cut of frequency{ 
     argv[1] = "dbz.wav"; 
    } 

任何和所有幫助是真正的讚賞

+0

學習編程時,您需要學習如何以獨立的較小比特來分解問題。 C++如何分析命令行與音頻無關。 – MSalters

回答

0

嗯,很明顯第一個比特是不正確,現在只要你想參數,Usage %s <cut-off> <input wav file>

第二位不起作用。 argv[1]=="NULL"是無意義的;它總是假的。 argv[1]是指向第一個參數的指針,但"NULL"是可執行文件中的字符串文字。該字符串文字將轉換爲另一個指針,並且這兩個指針不會相同。使用std::string(C++風格)或strcmp(C風格,仍然可以在C++中使用)。

至於新的參數,這將是另一個字符串 - 畢竟,你不控制用戶可以輸入什麼。他可能會輸入「sound.exe 230Hz dbv.wav」。你需要解析這個論點。一個簡單的方法是std::atoi(argv[1]),但由於缺少錯誤處理而略微受到影響。 std::strtol將返回停止解析的位置,因此如果用戶輸入230Hz,您將看到解析停止在H處。

0

在C++中有很多關於命令行解析的文章和庫,我建議AnyOption,因爲它很緊湊,易於使用,只依賴於stl。例如:

void example(int argc, char* argv[]) 
{ 
    AnyOption *opt = new AnyOption(); 

    opt->addUsage("Usage: "); 
    opt->addUsage(" -n --name   Wave file name "); 
    opt->addUsage(" -f --freq   Cut-off frequency "); 

    opt->setOption("name", 'n'); 
    opt->setOption("freq", 'f'); 

    opt->processCommandArgs(argc, argv); 

    char* name = NULL; 
    if(opt->getValue("name") != NULL) 
     name = opt->getValue("name"); 

    int freq = 0; 
    if(opt->getValue("freq") != NULL) 
     freq = atoi(opt->getValue("freq")); 

    delete opt; 
} 

對於音頻部分,您需要更精確一些。你的目的是什麼?你想對信號應用低通濾波器嗎?

相關問題