-4

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

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

  2. 在数字代码中,我试图从扬声器中发出数字声音代码,但是我确实做到了,我什至不确定声音实际上是数字的,因为使用N=2^1时可以听到声音质量非常好,有一点噪音,(当它应该只以 8 位播放时)希望这里有人可以帮帮我。

-------------------- 对于模拟声音

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 

-------------------- 对于数字声音(将 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)
4

1 回答 1

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
于 2015-02-08T12:58:32.983 回答