Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Matlab Filtering Frequencies

  1. Apr 27, 2016 #1
    I want to write a Matlab code which removes all frequency components from a .wav sound file except those within ##±25 Hz## of ##523 Hz## as well as its harmonics (up to the Nyquist frequency). I want to do this without using any built in filters.

    Here is my code so far:

    Code (Text):
    [s, Fs] = wavread('chord.wav'); % Reading the .wav sound file
    sNew = zeros(size(s)); % creating a matrix of zeros the size of s

    for i = 1:length(sNew)
        for N=1:1:(Fs/(2*(523+25))); % number of harmonics up to Nyquist freq
            while abs(s-(523.*N))<25 % while within ±25 range of each of the harmonics
                sNew(i)=1; % replace the 0 element in sNew with a 1
            end
        end
    end

    sFiltered=sNew.*s; % multiplying ones & zeros matrix with s to remove unwanted freqs

    wavplay(sFiltered,Fs); % playing the resulting filtered sound
    But this code doesn't work. When I run the code it takes forever and freezes, and there is no output. What is wrong here?

    Any help with fixing this code is greatly appreciated.
     
    Last edited: Apr 27, 2016
  2. jcsd
  3. Apr 29, 2016 #2

    FactChecker

    User Avatar
    Science Advisor
    Gold Member

    On anything that freezes, look hard at any 'while' statement to make sure it is not getting stuck in there. You can put some displays inside the loops to see what is happening. That being said, Matlab is VERY slow at programmed loops like that, so it might just be taking a long time.
     
  4. Apr 29, 2016 #3
    Your code produces no output because you have written your while loop in such a way that it easily goes infinite. Look at the relationship between the loop conditional and the inside of the loop! There is nothing inside the loop that could change the result of evaluating the conditional required to enter the loop.

    It is like coding, while 2 is less than 10, subtract 2 from 5. This would produce an infinite loop because subtracting 2 from 5 cannot change 2 being less than 10. Your loop is similar. The inside of the loop cannot change the value of the conditional.

    Another problem in your code is that you refer to the entire vector s in the while loop conditional statement. I think you mean to refer to just element i of s, like s(i). This will not fix the first problem I mentioned, but it will get you closer.
     
  5. Apr 30, 2016 #4
    Thank you so much for the hint, it helped me a lot.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Filtering Frequencies
  1. Low pass filter (Replies: 1)

  2. Noise Filter In Matlab (Replies: 1)

Loading...