Как я могу сэмплировать файл .wav, а затем восстановить его, используя nyquist? - в MATLAB - PullRequest
4 голосов
/ 28 декабря 2010

Это все сделано в MATLAB 2010

Моя цель - показать результаты: недостаточная выборка, частота Найквиста / избыточная выборка

Сначала мне нужно уменьшить выборку .wav-файла, чтобы получить неполный/ или беспристрастный поток данных, который я затем могу восстановить.

Вот схема того, что я собираюсь делать. Таким образом, поток представляет собой аналоговый сигнал -> аналоговый фильтр выборки -> АЦП -> повторная выборка вниз -> повторная выборка вверх-> ЦАП -> аналоговый фильтр реконструкции

что необходимо достичь:

F = частота

F (Гц = 1 / с) Пример 100 Гц = 1000(Cyc / sec) F (s) = 1 / (2f)

Пример проблемы: 1000 Гц = самая высокая частота 1/2 (1000 Гц) = 1/2000 = 5x10 (-3) сек / цикл иличастота дискретизации 5 мс

Это мой первый проект обработки сигналов с использованием matlab.

что у меня есть.

% Fs = frequency sampled (44100hz or the sampling frequency of a cd)

[test,fs]=wavread('test.wav'); % loads the .wav file
left=test(:,1);

% Plot of the .wav signal time vs. strength

time=(1/44100)*length(left);
t=linspace(0,time,length(left));
plot(t,left)
xlabel('time (sec)');
ylabel('relative signal strength')

**%this is were i would need to sample it at the different frequecys (both above and below and at) nyquist frequency.*I think.***

soundsc(left,fs) % shows the resaultant audio file , which is the same as original ( only at or above nyquist frequency however) 

Может кто-нибудь сказать мне, каксделать это лучше, и как сделать выборку на разных частотах?

вот. WAV файл http://www.4shared.com/audio/11xvNmkd/piano.html

РЕДАКТИРОВАТЬ:

%Play decimated file ( soundsc(y,fs) ) 
%Play Original file ( soundsc(play,fs ) )
%Play reconstucted File ( soundsc(final,fs) )

[piano,fs]=wavread('piano.wav'); % loads piano
play=piano(:,1); % Renames the file as "play"

t = linspace(0,time,length(play));          % Time vector
x = play;
y = decimate(x,25);

stem(x(1:30)), axis([0 30 -2 2])   % Original signal
title('Original Signal')
figure
stem(y(1:30))                        % Decimated signal
title('Decimated Signal')

%changes the sampling rate

fs1 = fs/2;
fs2 = fs/3;
fs3 = fs/4;
fs4 = fs*2;
fs5 = fs*3;
fs6 = fs*4;

wavwrite(y,fs/25,'PianoDecimation');


%------------------------------------------------------------------

%Downsampled version of piano is now upsampled to the original
[PianoDecimation,fs]=wavread('PianoDecimation.wav'); % loads piano
play2=PianoDecimation(:,1); % Renames the file as "play

%upsampling
UpSampleRatio = 2;  % 2*fs = nyquist rate sampling
play2Up=zeros(length(PianoDecimation)*UpSampleRatio, 1);
play2Up(1:UpSampleRatio:end) = play2; % fill in every N'th sample

%low pass filter

ResampFilt = firpm(44, [0 0.39625 0.60938 1], [1 1 0 0]);


fsUp = (fs*UpSampleRatio)*1;
wavwrite(play2Up,fsUp,'PianoUpsampled');

%Plot2
%data vs time plot
time=(1/44100)*length(play2);
t=linspace(0,time,length(play2));
stem(t,play2)
title('Upsampled graph of piano')
xlabel('time(sec)');
ylabel('relative signal strength')



[PianoUpsampled,fs]=wavread('PianoUpsampled.wav'); % loads piano
final=PianoUpsampled(:,1); % Renames the file as "play"


%-------------------------------------------------------------
%resampleing
[piano,fs]=wavread('piano.wav'); % loads piano
x=piano(:,1); % Renames the file as "play"
m = resample(x,3,2);

Оригинал: http://www.4shared.com/audio/11xvNmkd/piano.html

Новый: http://www.4shared.com/audio/nTRBNSld/PianoUs.html

Ответы [ 2 ]

4 голосов
/ 28 декабря 2010

Самое простое - изменить частоту дискретизации на целое число. Понижение частоты дискретизации состоит из пропускания данных через фильтр нижних частот с последующим отбрасыванием выборок, тогда как повышение частоты дискретизации состоит из вставки выборок с последующей обработкой данных через фильтр низких частот (также известный как реконструкция фильтр или интерполяционный фильтр). Псевдоним возникает, когда этапы фильтрации пропущены или выполнены плохо. Итак, чтобы продемонстрировать эффект псевдонима, я предлагаю вам просто отменить или вставить образцы по мере необходимости, а затем создать новый файл WAV с новой частотой дискретизации. Чтобы отказаться от образцов, вы можете сделать:

DownSampleRatio = 2;
%# Normally apply a low pass filter here
leftDown = left(1:DownSampleRatio:end); %# extract every N'th sample
fsDown = fs/DownSampleRatio;
wavwrite(leftDown, fsDown, filename);

Для создания сэмплов вы можете сделать:

UpSampleRatio = 2;
leftUp = zeros(length(left)*UpSampleRatio, 1);
leftUp(1:UpSampleRatio:end) = left; %# fill in every N'th sample
%# Normally apply a low pass filter here
fsUp = fs*UpSampleRatio;
wavwrite(leftUp, fsUp, filename);

Вы можете просто воспроизвести записанные файлы WAV, чтобы услышать эффекты.

Кроме того, вы попросили улучшить ваш код - я предпочитаю инициализировать вектор t как t = (0:(length(left)-1))/fs;.

0 голосов
/ 28 декабря 2010

Техника DSP, которая вам нужна, называется decimation .

...