Matlab 计算采样频率以从纯正弦波中产生特定的声音

Posted

技术标签:

【中文标题】Matlab 计算采样频率以从纯正弦波中产生特定的声音【英文标题】:Matlab computing the sampling frequency to produce a specific sound from a pure sine wave 【发布时间】:2018-08-05 21:17:40 【问题描述】:

我有一个很奇怪但很有趣的问题。这个想法是为了更好地理解播放音频时的采样率与频移。这个想法是一个小实验: clc;全部清除;

%synthetic example
%in practice it seems that a period T = 2*maxFreq is not enough -> i choose
%10
T=1/(10*10^6);%period should be at least 1/(2*10^6Hz) => Nyquist freq if we want to be able to reproduce 10^5Hz max freq
x=0:T:1-T;

f=10^6;%frequency
y=sin(2*pi*f*x);

%i see visually that there is 11 samples constituting 1 period
%plot(y(1:11))
%plot(y(100:111))
%etc
nbPeriods=length(y)/11;%nbtotalsamples/nbsamplesOf1Period
%y contains 10^6 oscillations each of 11 samples
%therefore if i want to reproduce a 1Khz sound, I compute my sampling frequency :
% Fs = nbPeriods/10^3 

Fs=909.09;

a=audioplayer(y,Fs)

tic;
play(a)
toc;

目标是以正确的采样频率 Fs 播放正弦波 y,从而获得 1KHz 的感知(从扬声器输出的音频)。

我的想法是生成一个非常高频的正弦波,这里是 10^6 Hz,然后以采样频率 Fs 播放它,这样我们就可以获得 1KHz。我计算出我需要 Fs = 909.09,但是 Matlab 拒绝了,我在控制台中收到此错误消息:

a = 

  audioplayer with properties:

          SampleRate: 909.0900
       BitsPerSample: 16
    NumberOfChannels: 1
            DeviceID: -1
       CurrentSample: 1
        TotalSamples: 10000000
             Running: 'off'
            StartFcn: []
             StopFcn: []
            TimerFcn: []
         TimerPeriod: 0.0500
                 Tag: ''
            UserData: []
                Type: 'audioplayer'

Error using audioplayer/resume (line 766)
Device Error: Invalid sample rate


Error in audioplayer/play (line 125)
obj.resume();

Error in sineExample (line 25)
play(a)

也许我的推理是错误的。有人可以帮助我思考这个/澄清/纠正我的(潜在)错误吗?

【问题讨论】:

阅读我的编辑。这是硬件限制 我回滚了您的编辑,因为您删除了真正的错误,即play 中的错误,而不是audioplayer 中的错误 没问题。但是,如果你有时间,我会对我为获得 Fs=909.09 所做的计算的正确性更感兴趣,你认为我的推理是否正确(当然,这样做的目的是为了更好地了解抽样率而不是播放 1kHz 波;))? 那是 1) 不是你问的问题 2) 不是编程问题。 好的,但假设是,你会尝试回答吗? 【参考方案1】:

令人困惑的手册指出:

Fs:以 Hz 为单位的采样率。有效值取决于两个采样率 MATLAB® 和您系统上的特定音频硬件允许。 MATLAB 有 1000 Hz

但您输入的采样率低于 1000Hz。

但正如您在评论中提到的,它似乎接受低至 80。这似乎是真的。

但是,错误在play。您只能播放您的声卡接受的频率。这就是为什么文档的最后一部分指出有更多限制的原因,因为您的声卡仅设计用于一组非常特定的采样率并且不能以任意频率播放。

【讨论】:

感谢您的回答,是的,您阅读手册确实是对的,但是,请承认这是否具有误导性,因为如果我给出 79 的采样率,我会得到这个答案: >> >> audioplayer(y,79) 使用 audioplayer 时出错(第 223 行) 采样率必须是 80 到 1000000 之间的正数 >> 看来Fs可以从低至80! 你听到声音了吗?像 1khz 波? @JohnDoe 原因与我的预期不同。

以上是关于Matlab 计算采样频率以从纯正弦波中产生特定的声音的主要内容,如果未能解决你的问题,请参考以下文章

matlab 生成白噪声和正弦波复合信号

matlab 使用定时器画连续正弦波信号

在 MATLAB 中生成要保存在 .mif 文件中的正弦波

采样率改变正弦波的音高,sound() 函数,MATLAB

怎么用ADC采样正弦信号来计算峰值

采用MATLAB对正弦信号,语音信号进行生成采样和恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波