一定の間引き係数でベクトルをダウンサンプリングした後、(いくつかの分析を実行した後) ベクトルを元のサンプル レートにアップサンプリングしたいと考えています。ただし、アップサンプリングに苦労しています。
ダウンサンプリングには Accelerate フレームワークから vDSP_desamp を適用し、アップサンプリングには vDSP_vlint を適用しようとしました。
// Create some test data for input vector
float inputData[10] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
int inputLength = 10;
int decimationFactor = 2; // Downsample by factor 2
int downSampledLength = inputLength/decimationFactor;
// Allocate downsampled output vector
float* downSampledData = malloc(downSampledLength*sizeof(float));
// Create filter (average samples)
float* filter = malloc(decimationFactor*sizeof(float));
for (int i = 0; i < decimationFactor; ++i){
filter[i] = 1.0/decimationFactor;
}
// Downsample and average
vDSP_desamp(inputData,
(vDSP_Stride) decimationFactor,
filter,
downSampledData,
(vDSP_Length) downSampledLength, // Downsample to 5 samples
(vDSP_Length) decimationFactor );
free(filter);
downSampledData
このコード を使用した出力は次のとおりです。
0.05, 0.25, 0.45, 0.65, 0.85
(処理された) データ ベクトルを元のサンプル レートにアップサンプリングするには、次のコードを使用します。
// For this example downSampledData is just copied to processedData ...
float* processedData = malloc(downSampledLength*sizeof(float));
processedData = downSampledData;
// Create vector used by vDSP_vlint to indicate interpolation constants.
float* b = malloc(downSampledLength*sizeof(float));
for (int i = 0; i < downSampledLength; i++) {
b[i] = i + 0.5;
}
// Allocate data vector for upsampled data
float* upSampledData = malloc(inputLength*sizeof(float));
// Upsample and interpolate
vDSP_vlint (processedData,
b,
1,
upSampledData,
1,
(vDSP_Length) inputLength, // Resample back to 10 samples
(vDSP_Length) downSampledLength);
ただし、の出力upSampledData
は
0.15、0.35、0.55、0.75、0.43、0.05、0.05、0.05、0.08、0.12
どうやら、これは正しくありません。どのように申請すればよいvDSP_vlint
ですか?または、データをアップサンプリングするために他の関数を使用する必要がありますか?