在matlab中的奈奎斯特定理

时间:2015-02-01 21:52:58

标签: matlab signals sampling adc

我正在尝试在matlab中制作一些小脚本,所以我可以听到模拟和数字正弦波,但我很困惑并且有2个问题

  1. 在模拟代码中,想法是能够通过更改 Tm 来更改作为采样周期的 Tm ,以便我可以选择用户的任何样本想。但是我坚持使用干函数,因为我无法在 stem()函数中更改采样率

  2. 在数字代码中,我正试图从扬声器中发出数字声音代码,然而我确实说,我甚至不确定声音实际上是数字的,因为使用 N时= 2 ^ 1 声音听起来质量非常好,噪音很小(当它只能以8位的方式播放时) 希望有人可以帮我一把。

  3. --------------------为模拟声音

    clf
    t=0:1:17.7
    y=sin(2*pi*0.06*t)          %// l von Vp de 2.5v
    
    plot(t,y)                   %// Entry signal
    hold on
    plot(t,y,'ko')              %// Output graph 
    stem(t,y)
    hold off
    
    n=[0:1:10000]               %// Duration of tone
    
    ftono=440                   %// sound frequency
    fm=8000                     %// frecuency sample rate 
    Tm=1/fm                     %// sampling period 
    
    A=1                  
    
    x=A*sin(2*pi*ftono*Tm*n)    %// Sin wave using sam,pling period 
    
    sound(x,fm)                 %// Analogic sound 
    

    -------------------- for the DIGITAL SOUND(将N从2 ^ 1改为2 ^ 16)

         clf
    t = 0:1:1600                  
    
    fm = 1000           
    Tm=1/fm
    
    ftono = 440           
    
    N=2^2
    
    senial = sin(2*pi*t*ftono*Tm)
    
    y = round(senial*N)/N
    
    plot(round(sin(2*pi*t/1000)*N)/N)
    
    sound(round(sin(2*pi*t*ftono*Tm)*N)/N, 1000)
    

1 个答案:

答案 0 :(得分:2)

首先,您应该了解两个片段都会产生数字声音。这不是您的代码的结果。由于您从数字信息中再现声音,因此声音是“数字的”。因此,如果你的两个声音具有相同的采样频率,那么两个声音都会被听到相同的声音。

从您的问题的主题判断,您应该尝试重现由采样频率不足引起的混叠效应,或者您应该尝试重现由小样本字长度引起的量化噪声。

我的第一个假设是基于采样频率,第二个是基于答案的“8位”部分。

您可以在下面的代码中演示这两种功能。

function adsoundtest(dur, freq, nbits, amp, fs)
%Reproduce a simulated analogue sound and a digital one
% ADSOUNTEST(DUR, FREQ, NBITS, AMP, FS)
% Duration (dur) is in seconds, freq is the signal's
% frequency in Hz, nbits is the number of bits for
% sample length, amp is the amplification of the sine
% wave (max 1) and fs is the sampling frequency in Hz.

    fs_analogue = 100 * freq;

    if nargin < 5
        if nargin < 4
            if nargin < 3
                if nargin < 2
                    error('ERROR:ADSOUNDTEST', 'Too few input arguments');
                end
                nbits = 16;
            end
            amp = 1;
        end
        fs = freq * 3;
    end

    fs_digital = fs;

    t_analogue = 0:1/fs_analogue:(dur - 1/fs_analogue);
    t_digital = 0:1/fs_digital:(dur - 1/fs_digital);

    w = 2 * pi * freq;

    x_analogue = amp .* sin(w .* t_analogue);
    x_digital = amp .* sin(w .* t_digital);

    try 
        ymax = intmax(['int' num2str(nbits)]);
        ymin = intmin(['int' num2str(nbits)]);
    catch me
        disp 'Number of bits not supported. Try 64, 32, 16 and 8';
        rethrow(me)
    end

    x_digital = round(mapminmax(x_digital, double(ymin), double(ymax)));

    sound(x_analogue, fs_analogue);
    disp('Press enter to continue')
    pause;
    sound(x_digital, fs_digital);
end