// 说明: // 本程序读取指定音频文件中的数据,使用FFT库进行频域分析, // 并计算基波和若干个谐波的幅度,进而计算总谐波失真。

// 头文件 #define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES #include <stdio.h> #include <math.h> #include "fft.h" // FFT库

// 宏定义 #define SAMPLE_RATE 44100 // 采样率 #define BUFFER_SIZE 1024 // 缓冲区大小 #define FUND_FREQ 1000 // 基波频率 #define NUM_HARMONICS 10 // 谐波数

// 主函数 int main() { // 读取音频数据 FILE* fp = fopen("audio.wav", "rb"); // 打开音频文件 short buffer[BUFFER_SIZE]; // 定义缓冲区 int num_samples = 0; // 初始化采样点数 while (!feof(fp)) // 读取音频数据 { int n = fread(buffer, sizeof(short), BUFFER_SIZE, fp); // 读取音频数据到缓冲区 num_samples += n; // 更新采样点数 // TODO: 处理音频数据 } fclose(fp); // 关闭音频文件

// FFT变换
fft_complex buf[BUFFER_SIZE]; // 定义复数数组
for (int i = 0; i < BUFFER_SIZE; i++) // 将音频数据赋值给复数数组
{
    buf[i].re = buffer[i]; // 实部为音频数据
    buf[i].im = 0; // 虚部初始化为0
}
fft(buf, BUFFER_SIZE); // 进行FFT变换

// 计算基波信号的幅度
double fund_amplitude = 0; // 初始化基波幅度
int fund_index = FUND_FREQ * BUFFER_SIZE / SAMPLE_RATE; // 计算基波频率对应的下标
fund_amplitude = sqrt(buf[fund_index].re * buf[fund_index].re + buf[fund_index].im * buf[fund_index].im); // 计算基波幅度

// 计算谐波信号的幅度
double harmonic_amplitude[NUM_HARMONICS]; // 定义谐波幅度数组
for (int i = 1; i <= NUM_HARMONICS; i++) // 循环计算每个谐波的幅度
{
    int harmonic_index = FUND_FREQ * i * BUFFER_SIZE / SAMPLE_RATE; // 计算谐波频率对应的下标
    harmonic_amplitude[i - 1] = sqrt(buf[harmonic_index].re * buf[harmonic_index].re + buf[harmonic_index].im * buf[harmonic_index].im); // 计算谐波幅度
}

// 计算总谐波失真
double total_harmonic_distortion = 0; // 初始化总谐波失真
for (int i = 0; i < NUM_HARMONICS; i++) // 循环累加每个谐波的幅度平方
{
    total_harmonic_distortion += harmonic_amplitude[i] * harmonic_amplitude[i];
}
total_harmonic_distortion = sqrt(total_harmonic_distortion) / fund_amplitude; // 计算总谐波失真

// 输出结果
printf("Total harmonic distortion: %.2f%%\n", total_harmonic_distortion * 100);

return 0; // 程序结束
#define _CRT_SECURE_NO_WARNINGS#define _USE_MATH_DEFINES#include stdioh#include mathh#include ffth FFT库#define SAMPLE_RATE 44100 采样率#define BUFFER_SIZE 1024 缓冲区大小#define FUND_FREQ 1000 基波频率#define

原文地址: https://www.cveoy.top/t/topic/hb3C 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录