2017-04-05 14 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; 
} 

对于音频部分,您需要更精确一些。你的目的是什么?你想对信号应用低通滤波器吗?

相关问题