录音/制作/创作 吉他 扩声技术 视频技术 作品展示 生活 信息 更多... | 音频应用专卖店

肤浅揭秘软件录音和DSP编程

( 69 )
 
[收藏]
-  第 3 页  -

324
#31 11-4-6 19:31
原帖憧憧 于 11-4-6 04:44 发表
由于我不是学习编程的,您的贴子除了语句注释部分能看得懂,其它部分都得要一边查着语句一边看。算法部分更是摸不着头脑。能否告知你编这种程序通常的开发环境是怎么样的吗?如果想对你说的 ...
谢谢观看拙文。

单纯的代码编程和IDE没有太大关系,用Notepad都行。调试、编译、链接什么的,和这些有关系。各个平台下,IDE很多,WIn下,微软的VS系列就挺好。MAC下有Xcode等等,Linux下更多……

行业软件开发,语言只是最微不足道的一个基础,关键是要懂这个行业,也就是所谓的专业。音乐方面,分类太多,太细了,很多都是前沿和边缘学科性质的……这个一时间还真不好说清楚。基本的乐理,演奏,和声、作曲、录音、混缩什么的,都要懂一点。等你开发出来东西,如果你们团队或者东家的实力很大,调试和测试阶段,一定会聘请最优秀的音乐家、录音师和乐手什么的来帮忙,都是按这些人的意见来修改完善。甚至前期规划的时候,就有音乐大师来参与,他们的看法和意见是最重要的。这个时候,就是学习的最佳时机,大师一般都没有架子,他们会手把手给你讲解的非常清楚,你也会有大把时间来实践。另外多看书,开卷有益。这些都不是论坛看帖讨论这么低效率的学习方式。

音频方面的开源代码,太多太多了,不过也是鱼龙混杂,就像随便哪个网友音乐网站一样,有好作品,也有很垃圾的瞎玩……国内的话,你可以多关注一下midiFan,顺藤摸瓜,就可知道……

324
#32 11-4-6 19:40

回复 moetan 在 #26 的 pid=3043340 的贴子

谢谢点击。C和C++的指针没那么复杂,10分钟就可学会。学语言也无需很高的智商,本身很简单的。这些和下棋都是一个道理。

324
#33 11-4-6 19:40
谢谢以上各位的点击和评论。

5395
#34 11-4-6 22:17
感谢您的回复!看来短期内是没有好办法了。。。
您说的没错,我用intel主要为了自动矢量化,还有他的数学库
以前上学那会主要用matlab和maple搞,对于c++这种
连矩阵乘法都得自己写的东西实在用着难受,用了intel
数学库实在解决了不少麻烦。。。不过实在不行就算了,昨天刚写完一个fft

关于iir的那个问题如果您有时间
找到或想到请一定告诉我,我想了巨久无头绪啊。。。
据说像z3ta+的滤波器都是用一帮老泡设计的模拟滤波器
参数直接转的数字滤波器,所以比较牛。这种情况对于新公司
非常不公平。唉。。。。

支持您以后多发类似文章,这类的我巨差,现在也就拿控制台
程序写写算法。

324
#35 11-4-7 21:04
门子,如果你的项目打算长期写下去并不断更新和维护,我还是不建议使用更多第三方的东西。C++是一个面向对象的语言(虽然并不纯粹),最大的优势就是代码重用和派生,所需的数学函数和算法等等可封装成类,而后不断完善。这样做一劳永逸。我感觉可能会更适合你。
象你进行到这一步,已经远远超出普通的编程范畴了,我的第二个建议是你找一到两位专职编码的C++程序员,你负责算法和思路,包括数学方面的东西,而后让他们用计算机语言来实现。分工后,效率会高很多。

324
#36 11-4-7 21:13
善始善终,给出巴特沃斯IIR滤波响应特性的头(部分)。注意有两个命名空间。
namespace Butterworth {

class AnalogLowPass : public LayoutBase
{
public:
  AnalogLowPass ();

  void design (const int numPoles);

private:
  int m_numPoles;
};

class AnalogLowShelf : public LayoutBase
{
public:
  AnalogLowShelf ();

  void design (int numPoles, double gainDb);

private:
  int m_numPoles;
  double m_gainDb;
};

// 有针对性的(减少)类模板的实例化……

struct LowPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency);
};

struct HighPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency);
};

struct BandPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency);
};

struct BandStopBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency);
};

struct LowShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double gainDb);
};

struct HighShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double gainDb);
};

struct BandShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency,
              double gainDb);
};

// Raw滤波 -- 类模板

template <int MaxOrder>
struct LowPass : PoleFilter <LowPassBase, MaxOrder>
{
};

template <int MaxOrder>
struct HighPass : PoleFilter <HighPassBase, MaxOrder>
{
};

template <int MaxOrder>
struct BandPass : PoleFilter <BandPassBase, MaxOrder, MaxOrder*2>
{
};

template <int MaxOrder>
struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2>
{
};

template <int MaxOrder>
struct LowShelf : PoleFilter <LowShelfBase, MaxOrder>
{
};

template <int MaxOrder>
struct HighShelf : PoleFilter <HighShelfBase, MaxOrder>
{
};

template <int MaxOrder>
struct BandShelf : PoleFilter <BandShelfBase, MaxOrder, MaxOrder*2>
{
};

// 第二个命名空间
namespace Design {

template <class FilterClass>
struct TypeI : DesignBase, FilterClass
{
  TypeI ()
  {
    addBuiltinParamInfo (idOrder);
    addBuiltinParamInfo (idFrequency);
  }

  void setParams (const Params& params)
  {
    FilterClass::setup (int(params[1]),
                        params[0],
                        params[2]);
  }
};

template <class FilterClass>
struct TypeII : DesignBase, FilterClass
{
  TypeII ()
  {
    addBuiltinParamInfo (idOrder);
    addBuiltinParamInfo (idFrequency);
    addBuiltinParamInfo (idGain);
  }

  void setParams (const Params& params)
  {
    FilterClass::setup (int(params[1]),
                        params[0],
                        params[2],
                        params[3]);
  }
};

template <class FilterClass>
struct TypeIII : DesignBase, FilterClass
{
  TypeIII ()
  {
    addBuiltinParamInfo (idOrder);
    addBuiltinParamInfo (idFrequency);
    addBuiltinParamInfo (idBandwidthHz);
  }

  void setParams (const Params& params)
  {
    FilterClass::setup (int(params[1]),
                        params[0],
                        params[2],
                        params[3]);
  }
};

template <class FilterClass>
struct TypeIV : DesignBase, FilterClass
{
  TypeIV ()
  {
    addBuiltinParamInfo (idOrder);
    addBuiltinParamInfo (idFrequency);
    addBuiltinParamInfo (idBandwidthHz);
    addBuiltinParamInfo (idGain);
  }

  void setParams (const Params& params)
  {
    FilterClass::setup (int(params[1]),
                        params[0],
                        params[2],
                        params[3],
                        params[4]);
  }
};

324
#37 11-4-7 21:16
切比雪夫。类模板略。头,部分。
namespace ChebyshevI {

class AnalogLowPass : public LayoutBase
{
public:
  AnalogLowPass ();

  void design (const int numPoles,
               double rippleDb);

private:
  int m_numPoles;
  double m_rippleDb;
};

class AnalogLowShelf : public LayoutBase
{
public:
  AnalogLowShelf ();

  void design (int numPoles,
               double gainDb,
               double rippleDb);

private:
  int m_numPoles;
  double m_rippleDb;
  double m_gainDb;
};//------------------------------------------------------------------------------

struct LowPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double rippleDb);
};

struct HighPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double rippleDb);
};

struct BandPassBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency,
              double rippleDb);
};

struct BandStopBase : PoleFilterBase <AnalogLowPass>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency,
              double rippleDb);
};

struct LowShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double gainDb,
              double rippleDb);
};

struct HighShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double cutoffFrequency,
              double gainDb,
              double rippleDb);
};

struct BandShelfBase : PoleFilterBase <AnalogLowShelf>
{
  void setup (int order,
              double sampleRate,
              double centerFrequency,
              double widthFrequency,
              double gainDb,
              double rippleDb);
};

324
#38 11-4-7 21:19
公共头,使用了标准库vector。
#include <stdlib.h>
#include <cassert>
#include <cfloat>
#include <cmath>
#include <complex>
#include <cstring>
#include <string>
#include <limits>

#include <vector>

324
#39 11-4-7 21:22
和复数(数据对)有关的一个结构体(头),一并给出吧。否则……呵。
struct ComplexPair : complex_pair_t
{
  ComplexPair ()
  {
  }

  explicit ComplexPair (const complex_t& c1)
    : complex_pair_t (c1, 0.)
  {
    assert (isReal());
  }

  ComplexPair (const complex_t& c1,
               const complex_t& c2)
    : complex_pair_t (c1, c2)
  {
  }

324
#40 11-4-7 21:29
共轭判断: bool isConjugate () const
  {
    return second == std::conj (first);
  }


极点(数据对)结构体:
struct PoleZeroPair
{
  ComplexPair poles;
  ComplexPair zeros;

  PoleZeroPair () { }

PoleZeroPair (const complex_t& p, const complex_t& z) : poles (p), zeros (z)
  {
  }

PoleZeroPair (const complex_t& p1, const complex_t& z1, const complex_t& p2, const complex_t& z2)
    : poles (p1, p2), zeros (z1, z2)
  {
  }

324
#41 11-4-7 21:31
所需的低通,高通,带通,带阻……之类的枚举:
enum Kind
{
  kindLowPass,
  kindHighPass,
  kindBandPass,
  kindBandStop,
  kindLowShelf,
  kindHighShelf,
  kindBandShelf,
  kindOther
};

5928
#42 11-4-7 21:32
太高深拉,不过楼主辛苦

5395
#43 11-4-8 04:32
在此感谢!这代码我收下了!

1316
#44 11-4-8 10:29
技术人才

820
#45 11-4-8 11:26
牛人。。。。。我上学时也学的编程,,,,不过全忘了!!!!

一看见代码就烦,,,,,比看见Cubase的钢琴窗还烦!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索