0

Visual Basic で実行されている JUCE のバッファー内にある信号をオーバーサンプリングしようとしています。 http://www.juce.com/about-juce

正確に言うと、オーバーサンプルとは、同じ時間でサンプル数を増やすことを意味します。たとえば、元のファイルが 44100 khz の場合、サンプル レートを 88200 khz に上げたいと思います。これは、信号に存在する可能性のあるデジタルアーティファクトを減衰させるのに役立ちます。

私が理解していることから、Juce にはこのためのクラスがあります。 ResamplingAudioSource http://www.juce.com/api/classResamplingAudioSource.html#details 私の問題は、クラスの実装方法がわからないことです。私は次のようにクラスの新しいインスタンスを作成しようとしました:

クラス PluginOversampler : public ResamplingAudioSource { public: PluginOversampler(); 〜PluginOversampler();

void    setResamplingRatio (double samplesInPerOutputSample)

}

PluginOversampler::setResamplingRatio(ここで指定された比率) を呼び出して、リサンプリング レートを変更できるという考えがあります。

しかし、プロジェクトは Visual Basic でコンパイルされません。エラーは数百にも及びます。それらのいくつかは、さまざまな .cpp および .h ファイルで使用するグローバル変数string22に関連しています。

std::string string22 = "";

結果のエラーが次の場合:

extern std::string string22;
1>c:\users\friendly2\downloads\final\ctrl\source\plugineditor.h(28): error     C2377:    'std::string' : redefinition; typedef cannot be overloaded with any other symbol

の宣言を省略すると、プロジェクトは正常にコンパイルされます

  PluginOversampler : public ResamplingAudioSource

他のエラー メッセージは、Juce ヘッダー ファイルがタイプを正しく定義していないことを示唆していますが、以前はプログラムが完全に機能していた (vst ファイルは DAW で正常に機能していた) ことを考えると、エラーは Juce ファイルではなく、自分のプログラミングに起因すると考えられます。これを実装しました。

私はすでに別のクラスをインスタンス化しています:

class PluginAudioProcessor  : public PluginProcessor
{
public:
    //==============================================================================
    PluginWidthCtrlAudioProcessor();
    ~PluginWidthCtrlAudioProcessor();

...
...

}

クラス「PluginAudioProcessor」に「ResamplingAudioSource」内の関数を継承させる必要がありますか? 私はかなり迷っています。

4

2 に答える 2

0

正確に言うと、オーバーサンプルとは、同じ時間でサンプル数を増やすことを意味します。たとえば、元のファイルが 44100 khz の場合、サンプル レートを 88200 khz に上げたいと思います。これは、信号に存在する可能性のあるデジタルアーティファクトを減衰させるのに役立ちます。

いいえ、ちがいます。

これは基本的な信号理論です。ナイキストが成立します。あなたはそれについて何もできません。信号は一度 44.1kS/s でデジタル化されており、その過程で失われた情報を取り戻す方法はありません (ヒント: 失われた情報はありません。人間は 22.05kHz より高い周波数のものを物理的に知覚できません。 )。

ここで、その信号を生成したサウンド カードが 0Hz ~ 22.05kHz のスペクトル全体にわたって完全に線形ではなかったと仮定することは完全に合理的です。これはイコライジングによって説明できますが、それはまったく別の話です。通常、そのプロセスでは、サブバンドに対して特別に作成されたデジタル フィルターを使用します。サブバンド自体は元の信号よりも帯域幅が低く、高くはありません。ただし、信号のイコライズは難しい問題であり、最初にデジタル化システムの特性を推定する必要があります。これは、既知の基準信号を取得する可能性がない場合、ほとんど不可能だと思います。

編集: ところで、あなたのエラーは、誤って typedef を再試行しようとしたように見えますstd::string(たとえば、typedef mytype std::string代わりに のようなことをしましたtypedef std::string mytype)。

于 2015-02-06T11:32:04.343 に答える
0

#define DONT_SET_USING_JUCE_NAMESPACE を使用できます

そして、JUCE::ResamplingAudioSource またはその他のジュース クラスを使用する必要があります。

JUCE クラスのほとんどは、他のライブラリまたはシステム ライブラリで既に定義されています。これは、ほとんどのバグを解決するのに役立ちます。

于 2015-02-06T11:24:26.523 に答える