Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: изменить частоту дискретизации
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Mad_max
Подскажите правильно ли я еду...
Задача такова, создать в matlab испытательное воздействие, прогнать через модель, заново подтянуть в matlab и посмотреть результат.

Испытательное воздействие - синусоида оцифрованная 16кГц.
Код
>> fs = 16000;
>> t = 0:1/fs:1;
>> x = (0.5)*sin(2*pi*800*t);

Модель (не в matlab) - фильтр дециматор, коэффициенты которого посчитаны исходя из следующей спецификации, частота оцифровки 16кГц, частота среза 1кГц, коэффициент децимации 8.
Подтянув результат фильтрации обратно в matlab, вижу что синусоида "улетела" на 800*8 = 6.4кГц.
Я так понимаю, что надо matlab'у сообщить, что sample rate этих данных не 16кГц а 2кГц.
Попытка вида
Код
>> fs = 2000;
>> t = 0:1/fs:1;

результата не дает, только меняет шаг сетки.

Как все же решить эту проблему?

slash_spb
Цитата(Mad_max @ Apr 20 2012, 13:56) *
Подскажите правильно ли я еду...
Задача такова, создать в matlab испытательное воздействие, прогнать через модель, заново подтянуть в matlab и посмотреть результат.

Испытательное воздействие - синусоида оцифрованная 16кГц.
Код
>> fs = 16000;
>> t = 0:1/fs:1;
>> x = (0.5)*sin(2*pi*800*t);

Модель (не в matlab) - фильтр дециматор, коэффициенты которого посчитаны исходя из следующей спецификации, частота оцифровки 16кГц, частота среза 1кГц, коэффициент децимации 8.
Подтянув результат фильтрации обратно в matlab, вижу что синусоида "улетела" на 800*8 = 6.4кГц.
Я так понимаю, что надо matlab'у сообщить, что sample rate этих данных не 16кГц а 2кГц.
Попытка вида
Код
>> fs = 2000;
>> t = 0:1/fs:1;

результата не дает, только меняет шаг сетки.

Как все же решить эту проблему?


А что вы хотите увидеть в итоге? Прикрепите пожалуйста файл с вернувшейся синусойдой.
Mad_max
Цитата(slash_spb @ Apr 20 2012, 16:31) *
А что вы хотите увидеть в итоге? Прикрепите пожалуйста файл с вернувшейся синусойдой.

Ну вот тут вопрос, должен ли я увидеть ту же синусоиду или в модели надо ставить интерполятор и тогда уже в matlabe я получу ту же синусоиду.
Смущает то, что если сделать в matlab
Код
y = filter(a,1,x);

Синусоида не "улетает".

Файл смогу только в понедельник прикрепить.
slash_spb
Цитата(Mad_max @ Apr 20 2012, 17:05) *
Ну вот тут вопрос, должен ли я увидеть ту же синусоиду или в модели надо ставить интерполятор и тогда уже в matlabe я получу ту же синусоиду.
Смущает то, что если сделать в matlab
Код
y = filter(a,1,x);

Синусоида не "улетает".

Файл смогу только в понедельник прикрепить.


Спектр до:

Код
fs = 16000;
t = 0:1/fs:1;
x = (0.5)*sin(2*pi*800*t);
plot([0:fs/(length(x)-1):fs],abs(fft(x)))



Спектр после децимации:
Код
x2 = x(1:8:end);
fs_dec = 2000;
plot([0:fs_dec/(length(x2)-1):fs_dec],abs(fft(x2)))


Частота синусойды не изменилась)
Mad_max
Если спектр построить при fs = 16000, то как раз получим синусоиду на 800*8=6.4кГц.
Но для Фурье в явном виде задается частота дискретизации сигнала.
Но нужен сигнал во временном домене.
slash_spb
Цитата(Mad_max @ Apr 20 2012, 18:34) *
Если спектр построить при fs = 16000, то как раз получим синусоиду на 800*8=6.4кГц.
Но для Фурье в явном виде задается частота дискретизации сигнала.
Но нужен сигнал во временном домене.


Интерполируем сигнал, или передескритезируем с частотой fs=16000.

Код
x2_1 = repmat(x2',1,8)'; x2_1 = x2_1(:);
plot([0:fs/(length(x2_1)-1):fs],abs(fft(x2_1)));


x2_1 - сигнал во временном домене. А на спектре видим размножение спектра относительно частоты дискретизации fs_dec.

А вот строить спектр сигнала и не верно указывать его частоту дискретизации не стоит. Так что нет никакой 6.4кГц. Вот если бы мы действительно изменили бы частоту дискретизации продецимированного сигнала с fs_dec до fs, тогда да. Но в реальном времени такое не возможно.
Mad_max
Прикрепил файл с дампом.
Подтянуть можно так
Код
function B = recal_data(elements,N)
% elements - number of elements in load file
% N - bit width
    fid = fopen('output','r');
    A = fscanf(fid, '%x ', elements);
    fclose(fid);

    C = reshape(A,1,elements);

    B = tc2dec(C,N);    
end

function B = tc2dec(C,N)
    K = length(C);
    for i = 1 : K,
        if ( C(i) > (2^(N-1) - 1) )
            B(i) = C(i) - 2^N;
            B(i) = B(i)/(2^(N - 1));
        else
            B(i) = C(i);
            B(i) = B(i)/(2^(N - 1));
        end
    end    
end

%B = recal_data(1500,16);

Возвращаясь к началу поста, хотелось бы посмотреть сигнал в matlab во временном домене.
Но для этого нужно поменять sample rate.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.