adc 应该能够很好地用于这种应用程序?

The adc should be able to work well for this kind of applications?

一段时间以来,我一直在尝试在 stm32f407ve 开发板上处理语音,这让我想知道 ADC 是否真的设置为对值进行精确采样。 CMSIS FFT 函数。但是当我尝试将它与 ADC 耦合以进行连续转换以对正弦信号进行采样时,它似乎不能很好地定期采样。我将一个正弦信号从互联网视频中的 1khz 正弦波的频率测试中放入一个正弦信号,这个插头是我从一些耳机中取出的,顺便说一句,我已经测试过它可以在示波器上正常工作。那么...开发板上的这个显然不是来自 DSP,但它的 ADC 应该可以正确地用于此类应用程序吗?这是我的代码,显然我确保测试在调试之前发出电压。

#include "main.h"
#include "arm_math.h"
#include "arm_const_structs.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define Fs 4096;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

/* USER CODE BEGIN PV */

#define SIGNAL_BUFFER_LENGTH 4096
float signalBuffer[2*SIGNAL_BUFFER_LENGTH];
float fftBuffer[2*SIGNAL_BUFFER_LENGTH];
float magnitudes[SIGNAL_BUFFER_LENGTH];


/* USER CODE END PV */
uint32_t k;
uint32_t cont1,cont2;

uint32_t start;
uint32_t stopi;
uint32_t delta;

float32_t maxValue;             /* Max FFT value is stored here */
uint32_t maxIndex;
float frecuencia=10.0;
float32_t Ts;
float tiempo;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
#define ARM_CM_DEMCR (*(uint32_t*)0xE000EDFC)
#define ARM_CM_DWT_CTRL (*(uint32_t*)0xE0001000)
#define ARM_CM_DWT_CYCCNT (*(uint32_t*)0xE0001004)

  if(ARM_CM_DWT_CTRL !=0){

      ARM_CM_DEMCR  |= 1<<24;
      ARM_CM_DWT_CYCCNT =0;
      ARM_CM_DWT_CTRL  |= 1<<0;


  }

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
  Ts=1.0/(float)Fs;


  HAL_ADC_Start(&hadc1);
  for(k=0;k<2*SIGNAL_BUFFER_LENGTH;k+=2 )
  {
      signalBuffer[k]=HAL_ADC_GetValue(&hadc1);


  }
  k++;
  //signalBuffer[0]=0;
 //start= ARM_CM_DWT_CYCCNT;
  arm_cfft_f32(&arm_cfft_sR_f32_len4096,signalBuffer,0,1);
  signalBuffer[0]=0;
  arm_cmplx_mag_f32(signalBuffer,magnitudes,4096);
  arm_max_f32(magnitudes, 4096, &maxValue, &maxIndex);
  //stopi = ARM_CM_DWT_CYCCNT;
  //delta=stopi-start;

  //tiempo=delta/8.0E07*1000.0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

您只是在循环中调用函数以获取单个读数。没有理由认为每次通过此循环都将花费相同的时间。您需要将 ADC 设置为从定时器触发,以获得某种可重现的采样率。

一般来说,内部 ADC 的质量不适合音频使用。此板安装了一个外部音频编解码器,请查看 Stm32CubeF4 包中的示例项目。