c语言实现48khz 音频重采样为44.1khz
时间: 2023-11-02 13:04:58 浏览: 42
下面是一个使用 C 语言实现 48kHz 音频重采样为 44.1kHz 的示例代码:
```c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
typedef short sample_t; // 16-bit signed integer
// 低通滤波器设计
void design_lowpass_filter(double cutoff_freq, double sample_rate, int num_taps, double* h) {
int i;
double fc = cutoff_freq / sample_rate;
double alpha = (num_taps - 1) / 2.0;
for (i = 0; i < num_taps; i++) {
if (i == alpha) {
h[i] = 2 * M_PI * fc;
} else {
h[i] = sin(2 * M_PI * fc * (i - alpha)) / (M_PI * (i - alpha));
}
h[i] *= 0.54 - 0.46 * cos(2 * M_PI * i / (num_taps - 1)); // 汉宁窗
}
}
// FIR滤波器
void fir_filter(const sample_t* input, const double* h, int num_taps, int num_samples, sample_t* output) {
int i, j;
for (i = 0; i < num_samples; i++) {
double acc = 0;
for (j = 0; j < num_taps; j++) {
if (i - j >= 0) {
acc += input[i - j] * h[j];
}
}
output[i] = round(acc);
}
}
// 48kHz音频重采样为44.1kHz
void resample48To44(const sample_t* src, sample_t* dst, int num_samples) {
int i, j;
const double kCutoffFreq = 0.95 * 22050; // 截止频率为22.05kHz
const int kNumTaps = 101; // 滤波器长度
double filterCoefficients[kNumTaps];
design_lowpass_filter(kCutoffFreq, 48000, kNumTaps, filterCoefficients); // 设计滤波器
const double kRatio = 44100.0 / 48000.0; // 比例
const int kUpsampledSize = num_samples * kRatio;
sample_t* upsampled = (sample_t*) malloc(kUpsampledSize * sizeof(sample_t));
for (i = 0; i < kUpsampledSize; i++) { // 插值
double index = i / kRatio;
int leftIndex = (int) floor(index);
int rightIndex = (int) ceil(index);
double leftValue = src[leftIndex];
double rightValue = src[rightIndex];
double fraction = index - leftIndex;
upsampled[i] = round(leftValue + fraction * (rightValue - leftValue));
}
sample_t* filtered = (sample_t*) malloc(kUpsampledSize * sizeof(sample_t));
fir_filter(upsampled, filterCoefficients, kNumTaps, kUpsampledSize, filtered); // 低通滤波
const double kFactor = 48000.0 / 44100.0;
for (i = 0; i < num_samples; i++) { // 抽取
int index = (int) round(i * kFactor);
dst[i] = filtered[index];
}
free(upsampled);
free(filtered);
}
```
注意,这里的重采样算法仅供参考,实际应用中需要根据具体情况进行调整和优化,以保证音频质量和性能。