I am lost

躺在沙发上眯了将近半个小时后,就被电话吵醒了。还好,也差不多歇了过来。

头懵懵的,搬个小凳坐在阳台上,喝水,发呆。

不知道自己想什么,只是觉得一点也不开心。

三天前,带着我的开心出发,三天后,我却忘记把它带回来了。

是被河神拿去交换我的愿望了吗。

如果是这样的话,河神,我想重新跟您许个愿望...

我想要什么,您懂的,这么多年了,磨的还不够么...

#include "stm32f4xx.h" #include <math.h> #include <stdlib.h> // 系统配置 #define SAMPLE_RATE 100000 // 采样率100kHz #define ADC_BUFFER_SIZE 1024 // ADC缓冲区大小 #define FREQ_START 88000 // 起始频率88MHz (kHz) #define FREQ_END 108000 // 结束频率108MHz (kHz) #define FREQ_STEP 100 // 频率步进100kHz #define TARGET_VPP 1.0 // 目标输出峰峰值1V #define VPP_TOLERANCE 0.1 // 峰峰值容差±0.1V // 调制类型枚举 typedef enum { MOD_NONE = 0, MOD_AM, MOD_FM, MOD_CW } ModType; // 全局变量 volatile uint16_t adcBuffer[ADC_BUFFER_SIZE]; // ADC数据缓冲区 float demodBuffer[ADC_BUFFER_SIZE]; // 解调数据缓冲区 ModType currentMod = MOD_NONE; // 当前调制类型 uint32_t currentFreq = FREQ_START; // 当前频率 float agcGain = 1.0; // AGC增益 uint8_t searchComplete = 0; // 搜索完成标志 // 硬件初始化 void Hardware_Init(void) { // 系统时钟配置 SystemInit(); // ADC初始化 (双通道同步采样) ADC_Init(); // DAC初始化 DAC_Init(); // 定时器初始化 (用于ADC触发和定时) TIM_Init(); // SPI初始化 (用于控制射频前端) SPI_Init(); // UART初始化 (用于调试输出) UART_Init(); // GPIO初始化 GPIO_Init(); } // 射频前端控制 (模拟函数) void RF_SetFrequency(uint32_t freqKHz) { // 通过SPI控制射频前端芯片设置频率 // 实际实现取决于使用的射频芯片 (如Si473x, RDA5807等) // 这里仅为示例 uint8_t data[4]; data[0] = (freqKHz >> 8) &amp; 0xFF; data[1] = freqKHz &amp; 0xFF; SPI_Transmit(data, 2); } // 信号强度检测 (模拟RSSI) int16_t RF_GetRSSI(void) { // 读取射频前端的RSSI值 // 实际实现取决于射频芯片 // 返回值单位: dBm return -70; // 示例值 } // 调制识别算法 ModType IdentifyModulation(void) { float ampSum = 0, ampSqSum = 0; float freqSum = 0, freqSqSum = 0; int sampleCount = ADC_BUFFER_SIZE / 2; // 使用一半数据进行计算 // 计算幅度和频率统计量 for (int i = 0; i < sampleCount; i++) { // 计算幅度 (I/Q通道) float I = adcBuffer[2*i] / 4096.0 * 3.3; // 假设12位ADC, 3.3V参考 float Q = adcBuffer[2*i+1] / 4096.0 * 3.3; float amplitude = sqrt(I*I + Q*Q); // 计算瞬时频率 (相位差分) float phase = atan2(Q, I); float freq = 0; if (i > 0) { float prevPhase = atan2(adcBuffer[2*(i-1)+1], adcBuffer[2*(i-1)]); float phaseDiff = phase - prevPhase; // 相位解卷绕 if (phaseDiff > M_PI) phaseDiff -= 2*M_PI; if (phaseDiff < -M_PI) phaseDiff += 2*M_PI; freq = phaseDiff * SAMPLE_RATE / (2*M_PI); } // 累加统计量 ampSum += amplitude; ampSqSum += amplitude * amplitude; freqSum += freq; freqSqSum += freq * freq; } // 计算标准差 float ampMean = ampSum / sampleCount; float ampVar = (ampSqSum / sampleCount) - (ampMean * ampMean); float ampStd = sqrt(ampVar); float freqMean = freqSum / sampleCount; float freqVar = (freqSqSum / sampleCount) - (freqMean * freqMean); float freqStd = sqrt(freqVar); // 调制识别逻辑 if (ampStd < 0.05 &amp;&amp; freqStd < 50) { return MOD_CW; // 单频载波 } else if (ampStd > 0.1 &amp;&amp; freqStd < 100) { return MOD_AM; // AM信号 (幅度变化大, 频率变化小) } else if (freqStd > 1000 &amp;&amp; ampStd < 0.1) { return MOD_FM; // FM信号 (频率变化大, 幅度变化小) } return MOD_NONE; // 未知调制 } // AM解调 (包络检波) void Demod_AM(void) { for (int i = 0; i < ADC_BUFFER_SIZE; i++) { // 计算幅度 (包络) float I = adcBuffer[2*i] / 4096.0 * 3.3; float Q = adcBuffer[2*i+1] / 4096.0 * 3.3; demodBuffer[i] = sqrt(I*I + Q*Q); } } // FM解调 (鉴频器) void Demod_FM(void) { float prevPhase = 0; for (int i = 0; i < ADC_BUFFER_SIZE; i++) { // 计算当前相位 float I = adcBuffer[2*i] / 4096.0 * 3.3; float Q = adcBuffer[2*i+1] / 4096.0 * 3.3; float phase = atan2(Q, I); // 计算相位差 (频率) if (i > 0) { float phaseDiff = phase - prevPhase; // 相位解卷绕 if (phaseDiff > M_PI) phaseDiff -= 2*M_PI; if (phaseDiff < -M_PI) phaseDiff += 2*M_PI; demodBuffer[i] = phaseDiff * SAMPLE_RATE / (2*M_PI); } else { demodBuffer[i] = 0; } prevPhase = phase; } } // AGC (自动增益控制) void Apply_AGC(void) { float maxVal = 0, minVal = 3.3; // 找到最大值和最小值 for (int i = 0; i < ADC_BUFFER_SIZE; i++) { if (demodBuffer[i] > maxVal) maxVal = demodBuffer[i]; if (demodBuffer[i] < minVal) minVal = demodBuffer[i]; } float currentVpp = maxVal - minVal; // 计算所需增益 float targetGain = TARGET_VPP / currentVpp; // 平滑增益调整 (避免突变) agcGain = 0.9 * agcGain + 0.1 * targetGain; // 应用增益 for (int i = 0; i < ADC_BUFFER_SIZE; i++) { demodBuffer[i] *= agcGain; // 限幅 (防止超出DAC范围) if (demodBuffer[i] > 3.3) demodBuffer[i] = 3.3; if (demodBuffer[i] < 0) demodBuffer[i] = 0; } } // DAC输出 (带偏置处理) void DAC_Output(void) { for (int i = 0; i < ADC_BUFFER_SIZE; i++) { // 添加直流偏置 (使信号在0-3.3V范围内) uint16_t dacValue = (uint16_t)((demodBuffer[i] + 1.65) / 3.3 * 4095); // 确保在DAC范围内 if (dacValue > 4095) dacValue = 4095; // 写入DAC DAC->DHR12R1 = dacValue; // 等待DAC转换完成 while(!(DAC->SR &amp; DAC_SR_DMAUDR1)); } } // 频率搜索 void Search_Signal(void) { currentFreq = FREQ_START; searchComplete = 0; while (currentFreq <= FREQ_END &amp;&amp; !searchComplete) { // 设置射频频率 RF_SetFrequency(currentFreq); // 等待频率稳定 delay_ms(10); // 检查信号强度 (灵敏度检查) int16_t rssi = RF_GetRSSI(); if (rssi > -95) { // 满足灵敏度要求 // 启动ADC采样 ADC_StartConversion(); // 等待采样完成 while(!ADC_ConversionComplete()); // 识别调制类型 currentMod = IdentifyModulation(); // 如果找到AM或FM信号 if (currentMod == MOD_AM || currentMod == MOD_FM) { searchComplete = 1; UART_SendString("Signal found at "); UART_SendNumber(currentFreq); UART_SendString(" kHz, Modulation: "); UART_SendString(currentMod == MOD_AM ? "AM" : "FM"); UART_SendString("\r\n"); } } // 下一个频率 currentFreq += FREQ_STEP; } if (!searchComplete) { UART_SendString("No signal found in range\r\n"); currentMod = MOD_NONE; } } // 主循环 int main(void) { // 硬件初始化 Hardware_Init(); // 主循环 while (1) { // 搜索信号 Search_Signal(); // 如果找到信号 if (currentMod != MOD_NONE) { // 解调信号 if (currentMod == MOD_AM) { Demod_AM(); } else if (currentMod == MOD_FM) { Demod_FM(); } // 应用AGC Apply_AGC(); // DAC输出 DAC_Output(); // 检查信号是否丢失 int16_t rssi = RF_GetRSSI(); if (rssi < -100) { // 信号丢失阈值 currentMod = MOD_NONE; UART_SendString("Signal lost\r\n"); } } else { // 未找到信号,延时后重试 delay_ms(1000); } } } // 延时函数 (简化版) void delay_ms(uint32_t ms) { HAL_Delay(ms); }这是基于stm32和si4735射频芯片设计一台简易自动接收机在keil5编程环境下的简易c代码,实现自动搜索并接收 88MHz~108MHz 频率范围内的调频或调幅信号,试分析其可行性。接收机接收的信号由射频信号源产生,载波频率调节步进为 100kHz,调制信号的频率范围为 300Hz~3400Hz。接收机输出端接 8Ω 负载电阻。自动识别调制方式,解调输出信号用示波器观察,波形应无明显失真。二、 要求1. 基本要求射频信号源载波电平范围为85dBm~60dBm。(1)搜索并解调调频信号。调频信号最大频偏 Δfmax满足 5kHz≤Δfmax≤75kHz,自动搜索解调一个调频信号,要求输出信号电压峰峰值≥0.9V。 (2)搜索并解调调幅信号。调幅信号调制度 m 满足 30%≤m≤60%,自动搜索解调一个调幅信号,要求输出信号电压峰峰值≥0.9V。(3)解调输出信号幅度自动控制。当调制信号为正弦波时,在基本要求(1)和(2)的测试中,要求输出信号电压峰峰值自动控制在 1V±0.1V。(4)要求接收机响应时间≤10s。 2. 发挥部分接收机整机必须采用 5V 单电源供电,工作时供电电流≤500mA。(1)自动识别单频载波、调频或调幅信号,显示识别结果,并解调出调频或调幅信号。(2)在基本要求(2)基础上,提高接收机灵敏度,要求搜索并解调载波电F - 1 / 2 平≤95dBm 的调幅信号。(3)要求接收机响应时间≤5s。
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值