• 通信原理实验(〇):音频信号的播放&蒙特卡洛模拟


    1.利用声卡播放音频信号

    function sine_gen
    N = 1000; % 每一次产生的长度 
    fs = 16e3; % 采样率16kHz 
    fc = 400; % 正弦波频率 
    dac = SoundCardDAC(fs); %构造dac对象 
    onCleanup(@dac.delete); %注册善后函数 
    while 1 
        t = (0:N-1)'/fs; % 时间t 
        y = sin(2*pi*fc*t); % 产生的信号 
        dac.tx(y); 
    end
    end
    classdef SoundCardDAC < handle
        % SoundCardDAC 利用声卡将数字信号转为模拟波形
        %   利用obj = SoundCardDAC(fs)构造对象,其中fs为采样率,单位Hz
        %   类方法: (1) tx(signal) 将信号signal添加到声卡缓存并进行播放,该函数可产生连续的信号输出
        %           (2) tx_once(signal) 直接播放信号signal,该函数仅产生一段突发的信号
        %           (3) delete 释放占用的资源,可在主函数中利用onCleanup调用
        
        properties (SetAccess = private, GetAccess = private)
            m_ao = 0;
            m_fs = 44100;
            m_state = 0;    % 0: uninitialize, 1: ready, 2: runing
        end
        
        methods
            function obj = SoundCardDAC(fs) 
                obj.m_fs = fs;
                obj.m_ao = analogoutput('winsound');
                addchannel(obj.m_ao,1);
                set (obj.m_ao, 'SampleRate', obj.m_fs);
                obj.m_state = 1;
                fprintf(1,'Info: Create soundCardDAC object, fs=%d.
    ', fs);
            end
            
            function tx(obj, signal)
                sample_th1 = obj.m_fs * 0.4;  % 保证声卡中至少有0.4s左右长度的数据
                sample_th2 = obj.m_fs * 0.6;  % 通常声卡缓冲区数据也不用太长
                
                signal = reshape(signal, length(signal), 1);    % 转为列向量
                
                if obj.m_state == 0  % not allowed
                    error('Error: SoundCard does not be initialized.
    ');
                    return;
                end
                
                putdata(obj.m_ao, signal);
                sample_av = get(obj.m_ao, 'SamplesAvailable');
    
                if obj.m_state == 1 % ready
                    if sample_av > sample_th1
                        obj.m_state = 2;
                        start(obj.m_ao);
                        fprintf(1,'Info: Starting DAC...
    ');
                    end
                elseif obj.m_state == 2 % running
                    if sample_av < sample_th1   % 缓冲区数据量小于阈值,预示有可能程序实时性不够
                        fprintf(1,'Warning: Program efficiency may be too low.
    ');
                    elseif sample_av > sample_th2 % 数据太快,让程序停顿一会儿
                        time_pause = (sample_av-sample_th2)/obj.m_fs;
                        pause(time_pause);
                    end
                else
                    error('Error: Unknown error occured.
    ');
                end
            end
            
            function tx_once(obj, signal)
                signal = reshape(signal, length(signal), 1);    % 转为列向量
               
                if obj.m_state == 0  % not allowed
                    error('Error: SoundCard does not be initialized.
    ');
                elseif obj.m_state == 1 % ready
                       putdata(obj.m_ao, signal);
                    sample_av = get(obj.m_ao, 'SamplesAvailable');
                    start(obj.m_ao);
                    time_pause = sample_av/obj.m_fs + 0.2;
                    pause(time_pause);
                    stop(obj.m_ao);
                elseif obj.m_state == 2
                    error('Error: Do not call tx() and tx_once() simultaneously.
    ');
                else
                    error('Error: Unknown error occured.
    ');
                end
            end
                    
            function delete(obj)
                if obj.m_ao ~= 0
                    stop(obj.m_ao);
                    delete(obj.m_ao);
                    obj.m_ao = 0;
                    obj.m_state = 0;
                    fprintf(1,'Info: Destory soundCardDAC object.
    ');
                end
            end 
        end
        
    end

    2.蒙特卡洛模拟求阴影面积

    syms x0;
    y0=int(sqrt(-x0^2+2*x0)*2,0,0.5)+int(sqrt(1-x0^2)*2,0.5,1);
    
    tic;
    N = 1e8; % 投掷次数 
    s_squre = 1*sqrt(3); 
    hit = 0; % 落在阴影面积内的概率 
    for k = 1:N 
        x = rand() ; % x坐标均匀分布于[0,1] 
        y = (rand() *2 -1)*sqrt(3)/2; % y坐标均匀分布于[-sqrt(3)/2,sqrt(3)/2] 
        if x*x + y*y < 1 && (x-1)*(x-1) + y*y < 1
            hit = hit + 1; % 若(x,y)落在阴影面积内 
        end
    end
    prob = hit/N; % 求解落在阴影面积中的概率 
    s_circle = s_squre* prob % 求阴影面积
    toc;
  • 相关阅读:
    storm环境搭建
    环境变量
    vmware tools安装及使用其实现与宿主机共享文件夹
    关于mysql中的count()函数
    centos7配置jdk8
    linux常用命令(随时更新中)
    ES中对索引的相关操作
    linux centos7下源码 tar安装mysql5.7.23(5.7以上均可试用)
    安装linux虚拟机配置静态ip(桥接模式,外部机器能够访问)
    安装linux虚拟机配置静态ip(NAT模式)
  • 原文地址:https://www.cnblogs.com/pursuit1996/p/4852572.html
Copyright © 2020-2023  润新知