产生C4D4E4F4G4A4B4的正弦波,加上它的十三次谐波和包络
时间: 2024-04-09 14:34:03 浏览: 55
正弦波的产生
下面是生成C4D4E4F4G4A4B4的正弦波信号并添加十三次谐波和包络的代码:
```matlab
% 参数设置
fs = 8000; % 采样频率
duration = 1; % 持续时间
notes = {'C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4'}; % 音符频率
% 生成时间轴
t = 0:1/fs:duration;
% 初始化信号
x_total = zeros(1, length(t));
% 添加各个音符的正弦波和谐波
for i = 1:length(notes)
f = note2freq(notes{i});
a = 1; % 基波幅度
% 生成正弦波信号
x = a * sin(2*pi*f*t);
% 添加谐波
harmonic_amplitudes = [0.20, 0.15, 0.15, 0.10, 0.10, 0.01, 0.05, 0.01, 0.01, 0.003, 0.003, 0.002, 0.002];
for j = 1:length(harmonic_amplitudes)
harmonic_amplitude = harmonic_amplitudes(j) * a;
harmonic_frequency = (j+1) * f;
x_harmonic = harmonic_amplitude * sin(2*pi*harmonic_frequency*t);
x = x + x_harmonic;
end
% 添加包络
env = exp(-t);
x = x .* env;
% 累加各个音符的信号
x_total = x_total + x;
end
% 绘制波形
subplot(2, 1, 1);
plot(t, x_total);
xlabel('Time (s)');
ylabel('Amplitude');
title('Sinusoidal Waveform with Harmonics and Envelope');
grid on;
% 播放信号
sound(x_total, fs);
% 做FFT,并绘制幅度谱
subplot(2, 1, 2);
N = length(x_total);
frequencies = (0:fs/N:fs-fs/N);
X = abs(fft(x_total))/N;
plot(frequencies, X);
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('Amplitude Spectrum');
grid on;
```
这段代码会在 MATLAB 中生成一个包含C4D4E4F4G4A4B4的正弦波信号,并添加十三次谐波和包络。然后,它会绘制波形图和幅度谱,并通过扬声器播放出来。
阅读全文