我正在尝试在matlab中制作一些小脚本,所以我可以听到模拟和数字正弦波,但我很困惑并且有2个问题
在模拟代码中,想法是能够通过更改 Tm 来更改作为采样周期的 Tm ,以便我可以选择用户的任何样本想。但是我坚持使用干函数,因为我无法在 stem()函数中更改采样率
在数字代码中,我正试图从扬声器中发出数字声音代码,然而我确实说,我甚至不确定声音实际上是数字的,因为使用 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
-------------------- 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)
答案 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