编写C代码实现阶跃信号延迟0.5毫秒步长时间的需求
C代码实现阶跃信号0.5毫秒延迟
离线数组处理版本
如果你的信号是预先存储的离散数组(比如测试用例中的test_input),可以通过数组移位实现延迟。根据你的示例,输出数组的第i位对应输入数组的第i-1位,输出首位固定为0,完全匹配你给出的输入输出对应关系。
#include <stdio.h> #include <string.h> #define SIGNAL_LEN 10 void delay_step_signal(const int input[], int output[], int len) { // 初始化输出数组,首位为0,其余先置0 memset(output, 0, sizeof(int) * len); // 实现信号向后移位一位(对应0.5毫秒步长延迟) for (int i = 1; i < len; i++) { output[i] = input[i-1]; } } int main() { int test_input[SIGNAL_LEN] = {0, 1, 1, 1, 1, 1, 1, 0, 0, 0}; int test_output[SIGNAL_LEN] = {0}; delay_step_signal(test_input, test_output, SIGNAL_LEN); // 打印输入输出结果 printf("输入信号: "); for (int i = 0; i < SIGNAL_LEN; i++) printf("%d ", test_input[i]); printf("\n输出信号: "); for (int i = 0; i < SIGNAL_LEN; i++) printf("%d ", test_output[i]); printf("\n"); return 0; }
编译运行后输出结果:
输入信号: 0 1 1 1 1 1 1 0 0 0 输出信号: 0 0 1 1 1 1 1 1 0 0
实时信号处理版本
如果是在嵌入式场景中处理实时阶跃信号(需要精确0.5毫秒延迟),可以结合定时器中断与状态缓存实现。以下是基于STM32平台的示例(其他平台可调整定时器配置逻辑):
#include "stm32f1xx_hal.h" // 缓存上一次采样的输入信号值 static int last_input = 0; // 输出信号,初始值设为0(匹配示例初始状态) static int output_signal = 0; // 定时器句柄(需预先配置为0.5毫秒触发一次中断) TIM_HandleTypeDef htim2; // 定时器中断回调,每0.5毫秒执行一次 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 更新输出为上一次采样的输入值,实现延迟 output_signal = last_input; // 采样当前输入信号(假设输入接PA0引脚) last_input = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) ? 1 : 0; } } int main(void) { // 初始化HAL库、GPIO、定时器 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); // 启动定时器中断 HAL_TIM_Base_Start_IT(&htim2); while (1) { // 将输出信号写入PA1引脚(假设输出接此引脚) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, output_signal ? GPIO_PIN_SET : GPIO_PIN_RESET); } }
说明
- 离线版本适用于已获取的离散信号数据,通过数组移位直接实现步长延迟。
- 实时版本通过定时器精确控制0.5毫秒的采样间隔,每次中断时用缓存的前一次输入值更新输出,实现连续信号的延迟。
内容的提问来源于stack exchange,提问作者Hiya
相关产品推荐
相关产品推荐

