首页 > 其他分享 >2024.9.22 计划

2024.9.22 计划

时间:2024-09-22 12:36:00浏览次数:1  
标签:distance vector 22 power 2024.9 计划 max np true

项目部分

个人学习部分

总结

如果得到了声音的信号,可以经过处理用python绘制出来对应位置的热力图,这里采用随机生成的声音信号,代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 常量定义
M_side = 16  # 使用4x4阵列
d = 0.1  # 麦克风之间的距离 (m)
c = 343  # 声速 (m/s)
N = 1000  # 采样点数
fs = 8000  # 采样频率 (Hz)
t = np.linspace(0, N / fs, N)  # 时间数组

# 定义更大的二维麦克风阵列的位置 (4x4平面阵列)
mic_positions = np.array([[i * d, j * d] for i in range(M_side) for j in range(M_side)])
M = mic_positions.shape[0]  # 总麦克风数量


# 每次生成随机位置和信号
def generate_random_signal():
    # 随机生成声源的二维平面位置
    true_x = np.random.uniform(0, 1)
    true_y = np.random.uniform(0, 1)

    # 随机生成信号频率 (200 Hz 到 2000 Hz)
    f = np.random.uniform(200, 2000)

    # 生成模拟的声源信号 s(t) (随机频率的正弦信号)
    s = np.sin(2 * np.pi * f * t)  # 正弦信号

    # 随机生成声源距离 (0.5米到2米)
    true_distance = np.random.uniform(1, 5)
    print(f"Generated random sound source at ({true_x:.2f}, {true_y:.2f}, {true_distance:.2f}) with frequency {f:.2f} Hz")

    return s, true_x, true_y, true_distance, f


# 生成麦克风阵列接收到的信号
def generate_received_signals(s, true_x, true_y, true_distance, f):
    X = np.zeros((M, N), dtype=complex)  # 麦克风阵列接收到的信号
    for m, pos in enumerate(mic_positions):
        # 计算每个麦克风到声源的距离
        distance = np.sqrt((true_x - pos[0]) ** 2 + (true_y - pos[1]) ** 2 + true_distance ** 2)

        # 引入距离衰减效应和相位延迟
        attenuation = 1 / (distance ** 2)  # 衰减因子
        delay = distance / c  # 计算相位延迟

        # 生成接收到的信号,并考虑衰减和延迟
        X[m, :] = attenuation * s * np.exp(-1j * 2 * np.pi * f * delay)
    return X


# 计算导向矢量函数,考虑平面上的 (x, y) 坐标和距离
def calculate_steering_vector(x, y, z, mic_positions, f, c):
    steering_vector = np.zeros(len(mic_positions), dtype=complex)
    for m, pos in enumerate(mic_positions):
        distance = np.sqrt((x - pos[0]) ** 2 + (y - pos[1]) ** 2 + z ** 2)
        steering_vector[m] = np.exp(-1j * 2 * np.pi * f * distance / c)
    return steering_vector


# 计算功率谱
def calculate_power_spectrum(steering_vector, R):
    return np.real(np.conjugate(steering_vector).T @ R @ steering_vector)


# 主函数:生成随机信号并计算热力图
def generate_heatmap():
    # 生成随机信号和位置、距离
    s, true_x, true_y, true_distance, f = generate_random_signal()

    # 生成麦克风阵列接收到的信号
    X = generate_received_signals(s, true_x, true_y, true_distance, f)

    # 加入噪声
    noise = 0.1 * np.random.randn(M, N)
    X += noise

    # 计算协方差矩阵 R
    R = (X @ X.conj().T) / N

    # 创建二维平面网格,定义扫描范围
    grid_size = 100  # 网格尺寸 (100x100)
    x_range = np.linspace(0, 1, grid_size)  # X 轴范围
    y_range = np.linspace(0, 1, grid_size)  # Y 轴范围
    power_map = np.zeros((grid_size, grid_size))

    max_power = -np.inf  # 初始化最大功率
    max_position = (0, 0)  # 初始化最大功率的位置

    # 扫描平面中的每个点 (x, y),假设声源在此点
    for i, x in enumerate(x_range):
        for j, y in enumerate(y_range):
            steering_vector = calculate_steering_vector(x, y, true_distance, mic_positions, f, c)
            power = calculate_power_spectrum(steering_vector, R)
            power_map[j, i] = power
            # 找到最大功率
            if power > max_power:
                max_power = power
                max_position = (x, y)

    # 归一化功率谱
    power_map = power_map / np.max(power_map)

    # 打印找到的声源位置和真实距离
    print(f"Estimated sound source position: {max_position} with true distance {true_distance:.2f} meters")

    # 绘制二维热力图
    plt.imshow(power_map, extent=[x_range.min(), x_range.max(), y_range.min(), y_range.max()], cmap='hot',
               origin='lower')
    plt.title(f'2D Sound Source Heatmap (Estimated Source at {max_position})')
    plt.colorbar(label='Power Spectrum')
    plt.show()


# 生成随机信号并绘制热力图
generate_heatmap()

同时考虑距离对于生成图片的影响,距离近的时候定位非常准确,产生的圆形范围较小,远的时候定位不够准确,圆形范围较大。
以下三张图分别以距离为0.31m, 1.31m, 4.31m作比较(位置为(0.34, 0.44)):
距离0.31m
距离1.31m
距离4.31m

标签:distance,vector,22,power,2024.9,计划,max,np,true
From: https://www.cnblogs.com/lautoh/p/18425159

相关文章

  • 游戏中的状态控制 适合于全部游戏 scratch 20240922_111017
    完整的游戏游戏封面游戏进行游戏暂停游戏结束预设状态值0欢迎界面1游戏进行2游戏暂停3游戏结束需要定义变量来适时的改变他们变量使用英文stat背景代码在背景的代码里定义了【欢迎画面】的自制积木实现游戏的状态值的初始化等待玩家输入如果玩家输入了1那么......
  • 2024.09.22 力扣刷题 Z字形变换
    题目:将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实......
  • 2024.9.21
    额,又是啥都没干的一天。打了至少五个小时的农==然后看了会儿数分的书,以及背英语。感觉不能打农,可以打游戏,但绝对不能打农,一把20分钟太过分了。感觉generals是好文明啊,20把gen也就是俩小时的事情。以后还是打gen吧。还有就是明天有acm,我因为一年不训被室友嫌弃了......
  • 2024.9.21 计划
    项目部分偷懒一天个人学习部分昨天DP的两个题DP一个题1.多重背包问题III总结01背包的优化:由于一般状态转移方程是:f[i][j]=f[i-1][j]+f[i-1][j-v]所以说优化空间的时候要倒着枚举体积,否则会导致f[i-1][j-v]被更新成f[i][j-v]完全背包的优化:一般状态转移......
  • 【Python爬虫系列】_022.异步文件操作aiofiles
    课程推荐我的个人主页:......
  • ubuntu22.04编译安装R4.4.1
    1.卸载当前版本的R:为了确保之前安装的R版本不会干扰,先卸载它:sudorm-rf/opt/R/4.4.1sudorm/usr/local/bin/Rsudorm/usr/local/bin/Rscript2.安装所需依赖:确保编译R所需的依赖已经安装:sudoapt-getupdate&&\sudoapt-getinstall-ybuild-essentialli......
  • 中国能源发展报告2022
    中国能源发展报告2022林伯强高耗能产业的出路高耗能产业布局:08年,东高西低>>08年之后,西高东低,自南向北移动,东减西增;转移趋势北部沿海城市-河北,山东,2012-2017高耗能产业流入下降,去产能;2009提出中部崛起战略,通过促进中部地区的制造业和城市化促进经济的增长,大量高......
  • 2024.9.2杂记
    洛谷P1990覆盖墙壁题目描述你有一个长为\(N\)宽为\(2\)的墙壁,给你两种砖头:一个长\(2\)宽\(1\),另一个是L型覆盖\(3\)个单元的砖头。如下图:00000砖头可以旋转,两种砖头可以无限制提供。你的任务是计算用这两种来覆盖\(N\times2\)的墙壁的覆盖方法。例如一个......
  • 【2024潇湘夜雨】WIN10_Pro_22H2.19045.4955软件选装纯净特别版9.20
    【系统简介】=============================================================1.本次更新母盘来自WIN10_Pro_22H2.19045.4955.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为19045.4955。......
  • Shiro-721—漏洞分析(CVE-2019-12422)
    目录PaddingOracleAttack原理PKCS5填充怎么爆破攻击漏洞原理源码分析漏洞复现本文基于shiro550漏洞基础上分析,建议先看上期内容:https://blog.csdn.net/weixin_60521036/article/details/142373353PaddingOracleAttack原理网上看了很多,感觉写的对我们这种对密码学不敏......