x = -pi:0.1:pi;
plot(x, cos(x))
clc;
clear;
close all;
%% 1. خواندن فایل صوتی (با تولید سیگنال جایگزین در صورت نبود فایل)
filename = 'File-Gamelan slendro.mid.mp3';
if ~exist(filename, 'file')
warning('فایل %s یافت نشد. یک سیگنال مصنوعی تولید میشود.', filename);
% تولید سیگنال ترکیبی از دو سینوس (به جای فایل)
Fs = 44100;
t = 0:1/Fs:3;
x = 0.7*sin(2*pi*440*t) + 0.5*sin(2*pi*880*t);
else
[x, Fs] = audioread(filename);
end
fprintf('نرخ نمونهبرداری Fs = %d Hz\n', Fs);
fprintf('تعداد نمونهها = %d\n', length(x));
%% 2. تبدیل به مونو
if size(x, 2) > 1
x = mean(x, 2);
end
%% 3. نرمالسازی
x = x / (max(abs(x)) + eps);
%% 4. نمایش سیگنال در حوزه زمان
t = (0:length(x)-1)/Fs;
figure;
plot(t, x);
xlabel('Time (s)');
ylabel('Amplitude');
title('Signal in Time Domain');
grid on;
%% 5. تحلیل طیف فرکانسی (FFT)
N = length(x);
X = fft(x);
f = (0:N-1)*(Fs/N);
figure;
plot(f(1:floor(N/2)), abs(X(1:floor(N/2))));
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title('Magnitude Spectrum (Original)');
grid on;
%% 6. کاهش نرخ نمونهبرداری (با مدیریت عدم وجود جعبهابزار)
M = 4;
Fs_ds = Fs / M;
% تلاش برای استفاده از lowpass (نیازمند Signal Processing Toolbox)
try
x_lp = lowpass(x, Fs/(2*M), Fs);
use_lowpass = true;
catch
warning('تابع lowpass در دسترس نیست. از فیلتر میانگینگیر ساده استفاده میشود.');
use_lowpass = false;
% فیلتر پایینگذر ساده با میانگین متحرک (طول پنجره = 2*M)
b = ones(1, 2*M) / (2*M);
x_lp = filter(b, 1, x);
end
% کاهش نرخ نمونهبرداری (downsample ممکن است در متلب پایه نباشد)
try
x_ds = downsample(x_lp, M);
catch
warning('تابع downsample در دسترس نیست. از اندیسگذاری دستی استفاده میشود.');
x_ds = x_lp(1:M:end);
end
fprintf('نرخ نمونهبرداری جدید Fs_ds = %d Hz\n', Fs_ds);
fprintf('تعداد نمونههای جدید = %d\n', length(x_ds));
%% 7. نمایش طیف سیگنال کاهشیافته
N_ds = length(x_ds);
X_ds = fft(x_ds);
f_ds = (0:N_ds-1)*(Fs_ds/N_ds);
figure;
plot(f_ds(1:floor(N_ds/2)), abs(X_ds(1:floor(N_ds/2))));
xlabel('Frequency (Hz)');
ylabel('Magnitude');
title(['Spectrum After Downsampling (Factor = ', num2str(M), ')']);
grid on;
%% 8. پخش صدا (با مدیریت خطای سختافزاری)
try
fprintf('پخش سیگنال اصلی...\n');
sound(x, Fs);
pause(length(x)/Fs + 0.5);
catch
warning('پخش صدای اصلی ممکن نیست (خروجی صوتی در دسترس نیست).');
end
try
fprintf('پخش سیگنال کاهشیافته...\n');
sound(x_ds, Fs_ds);
catch
warning('پخش صدای کاهشیافته ممکن نیست.');
end
fprintf('پایان برنامه.\n');
To embed this project on your website, copy the following code and paste it into your website's HTML: